在PHP中将Unicode字符转换为人类可读的字符串

时间:2016-08-14 15:30:20

标签: php string text unicode unicode-string

我遇到将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;

它可以打印如下所示的人类可读字符串。

enter image description here

使用这种方式我可以向用户显示结果。但问题是我想在数据库中存储为人类可读的字符串。所以我可以用该字符串做其他操作。所以我的问题是

  1. 如何在PHP中将Unicode字符转换为人类可读的字符串?
  2. OR

    1. 如何将第二种方法中的JavaScript结果分配到php中的字符串?
    2. 这是我很久以前问过的同一个问题,Converting unicode character to text in php is not working

2 个答案:

答案 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 +

从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}";

输出

ဆ႒မအာရံု မဂၢဇင္း

这会回答你的问题吗?