我遇到将php中的unicode字符转换为人类可读文本的问题。请参阅下面的方案。
我有一串unicode字符,如下面的
$chars = "\u1006\u1092\u1019\u1021\u102c\u101b\u1036\u102f \u1019\u1002\u1062\u1007\u1004\u1039\u1038 (\u1042\u1040\u1041\u1046 \u1007\u1030\u101c\u102d\u102f\u1004\u1039)";
如果我像这样回应
echo $chars
它不会转换为人类可读的字符串。但如果我像这样回应
$text = '<script type="text/javascript">
document.write("\u1006\u1092\u1019\u1021\u102c\u101b\u1036\u102f \u1019\u1002\u1062\u1007\u1004\u1039\u1038 (\u1042\u1040\u1041\u1046 \u1007\u1030\u101c\u102d\u102f\u1004\u1039)");
</script>';
echo $text;
它可以打印如下所示的人类可读字符串。
使用这种方式我可以向用户显示结果。但问题是我想在数据库中存储为人类可读的字符串。所以我可以用该字符串做其他操作。所以我的问题是
OR
这是我很久以前问过的同一个问题,Converting unicode character to text in php is not working。
答案 0 :(得分:1)
您可以使用/\\\\u([0-9a-f]{4})/iu
正则表达式将捕获数字的\uXXXX
符号子字符串匹配到第1组中,稍后将在preg_replace_callback
匿名函数中使用pack
数据成二进制字符串。由于我们将十六进制值传递给pack
函数,因此第一个参数 - 格式字符 - 应为H
:
H
十六进制字符串,高位半字节
查看PHP demo:
$chars = "\u1006\u1092\u1019\u1021\u102c\u101b\u1036\u102f \u1019\u1002\u1062\u1007\u1004\u1039\u1038 (\u1042\u1040\u1041\u1046 \u1007\u1030\u101c\u102d\u102f\u1004\u1039)";
$encoding = ini_get('mbstring.internal_encoding');
$str = preg_replace_callback('/\\\\u([0-9a-f]{4})/iu', function($match) use ($encoding) {
return mb_convert_encoding(pack('H*', $match[1]), $encoding, 'UTF-16BE');
}, $chars);
echo $str;
答案 1 :(得分:0)
从PHP 7开始,您可以使用Unicode codepoint escape syntax执行此操作。
echo "\u{1006}\u{1092}\u{1019}\u{1021}\u{102c}\u{101b}\u{1036}\u{102f} \u{1019}\u{1002}\u{1062}\u{1007}\u{1004}\u{1039}\u{1038}";
输出
ဆ႒မအာရံု မဂၢဇင္း
。
这会回答你的问题吗?