为了账号安全,请及时绑定邮箱和手机立即绑定

请问PHP:在不知道原始字符集的情况下将任何字符串转换为UTF-8,或者至少尝试

请问PHP:在不知道原始字符集的情况下将任何字符串转换为UTF-8,或者至少尝试

PHP
侃侃尔雅 2019-09-03 09:04:43
PHP:在不知道原始字符集的情况下将任何字符串转换为UTF-8,或者至少尝试我有一个应用程序来处理来自世界各地的客户,当然,我希望进入我的数据库的所有内容都是UTF-8编码的。对我来说主要的问题是我不知道任何字符串的来源是什么编码 - 它可以来自文本框(使用<form accept-charset="utf-8">仅在用户实际提交表单时才有用),或者它可能是从上传的文本文件,所以我真的无法控制输入。我需要的是一个函数或类,它确保进入我的数据库的内容尽可能采用UTF-8编码。我已经尝试iconv(mb_detect_encoding($text), "UTF-8", $text); 但是有问题(如果输入是'fiancée'它返回'fianc')。我尝试了很多东西= /对于文件上传,我喜欢要求最终用户指定他们使用的编码,并向他们展示输出结果的预览,但这对于讨厌讨厌的黑客没有帮助(事实上,它可以使他们的生活更容易一点)。我已经阅读了关于这个主题的其他SO问题,但它们似乎都有微妙的差异,例如“我需要解析RSS提要”或“我从网站上搜集数据”(或者,实际上,“你不能”)。但必须有一些东西,至少有一个很好的尝试!
查看完整描述

3 回答

?
catspeake

TA贡献1111条经验 获得超0个赞

你所要求的是非常困难的。如果可能,让用户指定编码是最好的。防止攻击不应该更容易或更难。

但是,您可以尝试这样做:

iconv(mb_detect_encoding($text, mb_detect_order(), true), "UTF-8", $text);

将其设置为严格可能会帮助您获得更好的结果。


查看完整回答
反对 回复 2019-09-05
?
倚天杖

TA贡献1828条经验 获得超3个赞

在祖国俄罗斯,我们有4种流行的编码,所以你的问题在这里有很大的需求。

只有符号的char代码才能检测到编码,因为代码页相交。一些不同语言的代码页甚至有完整的交集。所以,我们需要另一种方法。

使用未知编码的唯一方法是使用概率。所以,我们不想回答“这个文本的编码是什么?”这个问题,我们试图理解“ 这个文本最有可能的编码是什么? ”。

俄罗斯科技博客中的一个人发明了这种方法:

在您想要支持的每个编码中构建字符代码的概率范围。你可以使用你的语言中的一些大文本来构建它(例如,一些小说,使用莎士比亚的英语和托尔斯泰的俄语,哈哈)。你会得到像这样的smth:

    encoding_1:
    190 => 0.095249209893009,
    222 => 0.095249209893009,
    ...
    encoding_2:
    239 => 0.095249209893009,
    207 => 0.095249209893009,
    ...
    encoding_N:
    charcode => probabilty

下一个。您可以使用未知编码的文本和“概率词典”中的每个编码来搜索未知编码文本中每个符号的频率。符号的概率概率。具有更高评级的编码可能是赢家。更大的文本更好的结果。

如果您有兴趣,我很乐意帮助您完成这项任务。我们可以通过构建两个charcodes概率列表来大大提高准确性。

顺便说一句。mb_detect_encoding certanly不起作用。是的,完全没有。请查看“ext / mbstring / libmbfl / mbfl / mbfl_ident.c”中的mb_detect_encoding源代码。



查看完整回答
反对 回复 2019-09-05
?
慕无忌1623718

TA贡献1744条经验 获得超4个赞

你可能已经尝试过了,但为什么不使用mb_convert_encoding函数呢?它将尝试自动检测所提供文本的字符集,或者您可以将其传递给列表。

另外,我试图运行:

$text = "fiancée";echo mb_convert_encoding($text, "UTF-8");echo "<br/><br/>";echo iconv(mb_detect_encoding($text), "UTF-8", $text);

两者的结果都是一样的。你如何看待你的文字被截断为'fianc'?是在数据库中还是在浏览器中?



查看完整回答
反对 回复 2019-09-05
  • 3 回答
  • 0 关注
  • 320 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信