【问题标题】:Russian characters from hex to string utf8 - getting the wrong characters从十六进制到字符串 utf8 的俄语字符 - 获取错误的字符
【发布时间】:2019-12-18 09:02:19
【问题描述】:
我正在尝试将十六进制编码的参数传递给图像创建脚本。所有文件都是utf8。一切都很好,直到我循环遍历字符串。请参阅最小化的示例:
$string="ABCDЯ";
for($i=0;$i<strlen($string);$i++) {
echo $string[$i]."<br>"
}
给出输出:
A
B
C
D
�
而不是
A
B
C
D
Я
这是为什么呢?由于我想分析字符串中的字符,所以在这一点上失败了,因为所有俄语字符都以...结尾。
【问题讨论】:
标签:
php
hex
ascii
cyrillic
【解决方案1】:
在manual:
PHP中的字符串实现为字节数组和整数
表示缓冲区的长度。它没有关于如何
这些字节转换为字符,将该任务留给
程序员。
所以,您正在逐字节地迭代 $string。如果字符不是单字节编码的,则不会返回正确的结果。
鉴于 PHP 没有规定字符串的特定编码,一个
可能想知道字符串文字是如何编码的。例如,是
字符串 "á" 等价于 "\xE1" (ISO-8859-1)、"\xC3\xA1" (UTF-8, C
形式)、“\x61\xCC\x81”(UTF-8、D 形式)或任何其他可能的
表示?答案是字符串将以任何形式编码
时尚它被编码在脚本文件中。
您可以在迭代$string时使用mb_substr获取字符。
<?php
$string = 'ABCDЯ';
for($i = 0; $i < strlen($string); $i++) {
echo mb_substr($string, $i, 1, 'UTF-8') . '<br>';
}