当前位置: 首页 > 知识库问答 >
问题:

PHP编码转换为Windows-1252,同时保持UTF-8兼容性

文自怡
2023-03-14

我需要将上传的文件名转换为未知编码的Windows 1252,同时保持UTF-8兼容性。

当我将这些文件传递给控制器(我对其没有任何影响)时,这些文件必须经过Windows-1252编码。然后,该控制器再次生成通过MySQL存储到数据库中的有效文件(名称)列表-因此我需要UTF-8兼容性。传递给控制器的文件名和写入数据库的文件名必须匹配。到目前为止还不错。

在一些罕见的情况下,当转换为“Windows-1252”(与te字符“ï”类似)时,该字符被转换为UTF-8中的无效字符。MySQL然后删除这些无效字符-结果是磁盘上的文件名和存储到数据库中的文件名不再匹配。这种有时会失败的转换通过简单的重新编码实现:

$sEncoding       = mb_detect_encoding($sOriginalFilename);
$sTargetFilename = iconv($sEncoding, "Windows-1252//IGNORE", $sOriginalFilename);

为了防止转换生成无效字符,我可以再次从重新编码的字符串中删除所有无效UTF-8字符:

ini_set('mbstring.substitute_character', "none");
$sEncoding       = mb_detect_encoding($sOriginalFilename);
$sTargetFilename = iconv($sEncoding, "Windows-1252//TRANSLIT", $sOriginalFilename);
$sTargetFilename = mb_convert_encoding($sTargetFilename, 'UTF-8', 'Windows-1252');

但这将完全删除/重新编码字符串中留下的任何特殊字符。例如,我失去了所有 "äöüÄÖÜ" 等。,这在德语中很有规律。

如果您知道一种更简洁的Windows-1252编码方法(不丢失有效的特殊字符),请告诉我。

任何帮助都非常感谢。提前谢谢你!

共有3个答案

南宫海超
2023-03-14

在文件系统中保持ASCII-如果您需要在文件名中保持ASCII以外的字符,可以使用一些方案来表示Unicode字符,同时保持ASCII。

例如,百分比编码:

。txt

当然,这会很快达到文件名限制,而且不是很理想。

punycode怎么样?

。txt

翟渝
2023-03-14

你不能让一个字符串同时是Windows-1252和UTF-8。前128个字符的字符集是相同的(例如,它们包含基本的拉丁字母),但是当它超出这个范围时(比如UmLauts),它要么是一个,要么是另一个。它们在UTF-8中的代码点与在Windows-1252中的代码点不同。

朱翔
2023-03-14

我认为主要的问题是mb_detect_encoding()并不像您想象的那样。它试图检测字符编码,但它是从相当有限的预定义编码列表中检测的。默认情况下,这些编码是mb_detect_order()返回的编码。在我的计算机中,它们是:

  • ASCII码

因此,除非编译候选编码列表并将其提供给函数,否则此函数是完全无用的。

此外,基本上没有可靠的方法来猜测任意输入字符串的编码,即使您仅限于编码的一小部分。在您的情况下,Windows-1252ISO-8859-1ISO-8859-15非常接近,除了对关键字符(如€或€)进行目视检查之外,您无法将它们区分开来。

 类似资料:
  • 我有UTF-8源数据,我必须创建在Windows 1252字符编码编码的CSV文件。 我尝试了经典功能,但效果不佳。它必须支持转换后的塞尔维亚字符: "čćžšđ" 。 此外,我还尝试转换为CP1252、ISO-8859-1、ISO-8859-2,功能包括:mb_convert_编码、iconv和iconv_set_编码。 有人知道该试试什么吗?

  • 在我的Silverlight应用程序中,我得到了一个用windows-1252编码的XML文件。现在我的问题,它不会正确显示,直到Windows-1252字符串转换为UTF8字符串。在一个正常的C#环境中,这不会是一个大问题:在那里我可以做这样的事情: (将字符串的字符编码从windows-1252转换为utf-8) 但是silverlight不支持windows-1252,它只支持unicode

  • 我试图保存一个字符串在希伯来文文件,同时有文件ANSI编码。恐怕所有的尝试都失败了。 PHP文件本身是UTF-8 这是我正在尝试的代码: 由于某种原因,返回false。 另一次尝试是: 这返回一个空字符串。当这不起作用时,将输出字符集更改为Windows-1255的工作。所以函数本身工作,但由于某种原因,它不转换为1252。 我运行这个函数之前和之后的和打印的结果 在图标之前编码是UTF-8,在图

  • 我正在尝试将我们的数据库从latin1转换为UTF-8。不幸的是,我不能做一个大规模的单一切换,因为应用程序需要保持在线,我们有700GB的数据库要转换。 因此,我试图利用mysql的一些技巧,将表转换为UTF-8,而不是数据。我希望数据能够被实时读取、转换和替换。(如果愿意,可以进行JIT转换) 我们的php应用程序目前使用所有默认值,所以它使用latin1字符集连接到mysql,并丢弃在lat

  • 本文向大家介绍PHP 将ASCII转换为UTF-8编码,包括了PHP 将ASCII转换为UTF-8编码的使用技巧和注意事项,需要的朋友参考一下 如果我们知道当前的编码是ASCII,则可以使用'iconv'函数将ASCII转换为UTF-8。原始字符串可以作为参数传递给iconv函数,以将其编码为UTF-8。 示例 具有特殊字符的字符串被分配给'str'变量。它以当前所在的编码以及需要转换为的编码传递

  • 将编码传递到UTF-8后,我无法在Windows-1252中显示字符串。 我被迫在init中转换为UTF-8 我想将我的字符串转换为Windows-1252字符以显示它: 我正在得到这个结果 如何获得正确的以下结果? 谢谢! 当做