我想将印地文/梵文文本(例如“आएपर्यटक,खुदबहग”)转换为Unicode转义字符,例如“ \ u0906 \ u090f \ u0925 \ u0947 \ u092a \ u0930 \ u094d \ u092f \ u091f \ u0915, \ u0916 \ u0941 \ u0926 \ u0939 \ u0940 \ u092c \ u0939 \ u0917”。
我正在开发一个印地语网站,我已经看到大多数网站在其元标记和schema.org中使用转义的Unicode序列。 所以我决定尝试一下。
我可以在http://www.endmemo.com/unicode/devanagari.php上看到印地语AKA Devanagari字母及其转义的Unicode序列
我也看到了一个与https://www.mobilefish.com/services/unicode_escape_sequence_converter/unicode_escape_sequence_converter.php相同的工具
但是我找不到任何方法可以通过php将这些梵文字母转换为Escaped Unicode序列。
我尝试了很少的事情,但是没有任何效果,并且我没有从Google那里获得太多帮助,因为所有文章/论坛都在讨论将Unicode逸出序列解码为Unicode,但是它们都没有涉及编码。
header( 'Content-Type: text/html; charset=utf-8' );
function encode2($str) {
$str = mb_convert_encoding($str , 'UTF-32', 'UTF-8');
$t = unpack("N*", $str);
$t = array_map(function($n) { return "&#$n;"; }, $t);
return implode("", $t);
}
$message = "आए थे पर्यटक, खुद ही बह गए";
$message_convert = encode2($message);
echo $message_convert;
echo "fdfdfdfdfdfdfd<br/>";
echo mb_convert_encoding($message, "HTML-ENTITIES", "auto");
我想要这个“आएपयटयटयटयटto”到“ \ u0906 \ u090f \ u0925 \ u0947 \ u092a \ u0930 \ u09d \ u094d \ u092f \ u091f \ u0915,\ u0916 \ u0941 \ u0926 \ u0939 \ u0940 \ u092c \ u0939 \ u0917“
请帮助!
答案 0 :(得分:0)
我尝试过@paskl的建议:
$message = "आए थे पर्यटक, खुद ही बह गए";
$unicode = json_encode($message)
echo $unicode;
我得到了“”“ \ u0906 \ u090f \ u0925 \ u0947 \ u092a \ u0930 \ u094d \ u092f \ u091f \ u0915,\ u0916 \ u0941 \ u0926 \ u0939 \ u0940 \ u092c \ u0939 \ u0917 \ u090f”“ < / p>
我希望它将对希望将devanagari / hindi字母转换为PHP的转义Unicode序列的其他人提供帮助。
感谢@paskl
答案 1 :(得分:0)
除非您希望以JSON格式传输此数据,否则我不建议您使用json_encode()
,因为它会将您的输出包装在需要去除的文字双引号中。但是,没有一种简单的方法可以以节省内存的方式在PHP中编码Unicode转义。
也就是说,这是不容易的代码:
// PHP < 7.2
// https://github.com/symfony/polyfill-mbstring/blob/master/Mbstring.php#L708-L730
if( ! function_exists("mb_ord") ) {
function mb_ord($s) {
if (1 === \strlen($s)) {
return \ord($s);
}
$code = ($s = unpack('C*', substr($s, 0, 4))) ? $s[1] : 0;
if (0xF0 <= $code) {
return (($code - 0xF0) << 18) + (($s[2] - 0x80) << 12) + (($s[3] - 0x80) << 6) + $s[4] - 0x80;
}
if (0xE0 <= $code) {
return (($code - 0xE0) << 12) + (($s[2] - 0x80) << 6) + $s[3] - 0x80;
}
if (0xC0 <= $code) {
return (($code - 0xC0) << 6) + $s[2] - 0x80;
}
return $code;
}
}
function ord2seqlen($ord) {
if($ord < 128){
return 1;
} else if($ord < 224) {
return 2;
} else if($ord < 240) {
return 3;
} else if($ord < 248) {
return 4;
} else {
throw new \Exception("No support for 5 or 6 byte sequences.");
}
}
function utf8_seq_iter($input) {
for($i=0,$c=strlen($input); $i<$c; ) {
$bytes = ord2seqlen(ord($input[$i]));
yield substr($input, $i, $bytes);
$i += $bytes;
}
}
function escape_codepoint($codepoint, $skip_low=true) {
$ord = mb_ord($codepoint);
if( $skip_low && $ord < 128 ) {
return $codepoint;
} else {
return sprintf("\\u%04x", $ord);
}
}
$input = "आए थे पर्यटक, खुद ही बह गए";
$output = '';
foreach( utf8_seq_iter($input) as $codepoint ) {
$output .= escape_codepoint($codepoint);
}
var_dump($output);
输出:
string(121) "\u0906\u090f \u0925\u0947 \u092a\u0930\u094d\u092f\u091f\u0915, \u0916\u0941\u0926 \u0939\u0940 \u092c\u0939 \u0917\u090f"
编辑:我已将其变成一个小的作曲家程序包,可在此处使用: