【问题标题】:PHP: Polish UTF-8 characters displayed incorrectlyPHP:波兰语 UTF-8 字符显示不正确
【发布时间】:2014-08-09 00:36:37
【问题描述】:

首先,大家好。我对 PHP 和波兰语字符有疑问,即“ą Ą ć Ć ę Ę ł Ł ń Ń ó Ó ś Ś ź Ź ż Ż”。下面是我的示例代码。我在$string 变量中有所有波兰语符号,在$utfString 变量中有它们对应的UTF-8(十六进制)表示。

<?php
header('Content-Type: text/html; charset=utf-8');

$string = 'ą Ą ć Ć ę Ę ł Ł ń Ń ó Ó ś Ś ź Ź ż Ż';
$utfString = "\xC4\x85 \xC4\x84 \xC4\x87 \xC4\x86 ".
    "\xC4\x99 \xC4\x98 \xC5\x82 \xC5\x81 ".
    "\xC5\x84 \xC5\x83 \xC3\xB3 \xC3\x93 ".
    "\xC5\x9B \xC5\x9A \xC5\xBA \xC5\xB9 ".
    "\xC5\xBC \xC5\xBB";

echo $string;
var_dump(utf8_encode($string));
echo $utfString;
var_dump(utf8_encode($utfString));

?>

浏览器的响应如下所示:

� � � � � � � � � � � � � � � � � �
string '¹ ¥ æ Æ ê Ê ³ £ ñ Ñ ó Ó     ¿ ¯' (length=53)
ą Ą ć Ć ę Ę ł Ł ń Ń ó Ó ś Ś ź Ź ż Ż
string 'Ä Ä Ä Ä Ä Ä Å Å Å Å Ã³ à ŠŠź Ź ż Å»' (length=89)

如您所见,这些字符串的输出不同。我的问题是我能做些什么呢?我正在考虑编写一个函数,将代码中的波兰符号转换为它们各自的 UTF-8 表示,但这似乎远非最佳且相当困难。另一种选择是在我需要波兰符号时使用这种 UTF-8 表示,但话又说回来,我不相信它应该这么难和令人费解。有趣的是,当我从数据库中获取这样一个字符串并显示它时,一切正常。

脚本文件被编码为没有 BOM 的 UTF-8。

【问题讨论】:

    标签: php encoding utf-8


    【解决方案1】:

    utf8_encode 是一个名称不佳的函数,它很少是你需要的。它将以 ISO 8859-1 编码的文本转换为 UTF-8,因此如果您的文本一开始就不是该特定编码,它将无济于事。

    PHP 没有任何内置的字符编码、Unicode 或其他概念;字符串只是一组字节,echo 只是将这些字节发送到输出(因此通常发送到浏览器)。你不需要告诉 PHP 你输出的字符串是 UTF-8,因为它不在乎。

    在你的情况下,我认为答案就是不要打电话给utf8_encode

    【讨论】:

    • 这不是问题。我知道utf8_encode() 不能胜任这项工作。我只在var_dump() 内部使用了utf8_encode(),以便查看变量$string 的任何内容。否则它只会显示问号。主要问题是带有“正常”字符串的echo 给出了错误的结果。例如,如果我想显示单词“błąd”,我将不得不使用类似'b'."\xC5\x82\xC4\x85".'d' 而不是błąd
    • 您仍然将 utf8_encode 视为一些神奇的“使我的字符串可见”功能。那不是它的作用。你所做的只是让发现真正的问题变得更加困难。您需要知道的是正在输出哪些字节(不以任何方式处理它们),例如使用十六进制编辑器或ord() 函数。
    • 好的,我发现了问题。显然 scrypt 文件没有编码为没有 BOM 的 UTF-8,尽管在保存文件时要求它。使用十六进制编辑器的提示让我意识到这一点,所以谢谢你的帮助。我无法将您的答案标记为正确,因为这不是问题所在,但仍然感谢您。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-09
    • 2011-08-09
    相关资源
    最近更新 更多