PHP:将任何字符串转换为UTF-8,无需了解原始字符集,或者至少尝试转换。

10 浏览
0 Comments

PHP:将任何字符串转换为UTF-8,无需了解原始字符集,或者至少尝试转换。

我有一个应用程序,处理来自世界各地的客户,自然而然,我希望进入我的数据库的所有内容都是UTF-8编码的。

对于我来说,主要问题是我不知道任何字符串源的编码将是什么-它可能来自文本框(仅当用户实际提交表单时使用

才有用),也可能来自上载的文本文件,因此我对输入没有任何控制。

我需要一个函数或类,确保进入我的数据库的内容在尽可能的情况下是UTF-8编码的。我已经尝试过iconv(mb_detect_encoding($text),\"UTF-8\",$text);,但是它有问题(如果输入是\'fiancée\',它返回\'fianc\')。 我试过很多东西 = / </ p>

对于文件上传,我喜欢让最终用户指定他们使用的编码,并向他们显示输出的预览,但这不能防止恶意黑客的攻击(事实上,这可能会使他们的生活更容易)。

我已经阅读了其他Stack Overflow问题,但它们似乎都有微妙的区别,例如“我需要解析RSS源”,或“我从网站抓取数据”(或者,“您不能”)。

但是肯定有人至少尝试了来解决这个问题!

admin 更改状态以发布 2023年5月24日
0
0 Comments

在祖国俄罗斯,我们有四种流行的编码方式,因此你的问题在这里备受关注。

仅通过符号的字符代码无法检测编码,因为码页会相互交叉。甚至,不同语言中的某些码页会完全重叠。因此,我们需要另一种方法

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

这里有个人在一个流行的俄罗斯技术博客中发明了这种方法:

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

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

接下来,对于未知编码的文本,对于“概率字典”中的每种编码,在未知编码的文本中搜索每个符号的频率。对符号的概率求和。具有更高评分的编码可能是胜利者。更大的文本会有更好的结果。

顺带一提,mb_detect_encoding根本不起作用。是的,根本不起作用。请查看“ext/mbstring/libmbfl/mbfl/mbfl_ident.c”中的mb_detect_encoding源代码。

0
0 Comments

你要求的东西非常困难。如果可能的话,让用户指定编码会是最好的。这样做预防攻击应该不会更容易或更难。

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

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

将其设置为严格模式可能有助于获得更好的结果。

0