【问题标题】:Convert Hindi text to Escaped Unicode character with php使用 php 将印地语文本转换为转义的 Unicode 字符
【发布时间】:2019-08-20 10:54:37
【问题描述】:

我想将Hindi / devanagari文本转换为“आएथेपर्यटक,खुदहीबहबह”进入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看到带有转义Unicode序列的印地语AKA梵文字母

我还看到了一个同样工作的工具https://www.mobilefish.com/services/unicode_escape_sequence_converter/unicode_escape_sequence_converter.php

但我找不到任何方法通过 php 将这些梵文字母转换为转义的 Unicode 序列。

我尝试了一些东西,但没有任何效果,而且我没有从谷歌那里得到太多帮助,因为所有文章/论坛都在讨论将 unicode 转义序列解码为 un​​icode,但没有一个涉及编码..

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");

我想要这个“आएथेपर्यटक,खुदखुदबहबह”到“\ u0906 \ u090f \ u0925 \ u0947 \ u092a \ u0930 \ u094d \ u092f \ u091f \ u0915,\ u0916 \ u0941 \ u0926 \ u0939 \ u0926 \ u0939 \ u0926。 u092c\u0939 \u0917"

请帮忙!

【问题讨论】:

  • 你不能只使用json_encode($message) 吗?这应该回馈string(123) ""\u0906\u090f \u0925\u0947 \u092a\u0930\u094d\u092f\u091f\u0915, \u0916\u0941\u0926 \u0939\u0940 \u092c\u0939 \u0917\u090f""
  • 哦!它正在工作

标签: php unicode unicode-escapes


【解决方案1】:

按照@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"

我希望它可以帮助其他想要在他们的网站上使用 php 将梵文/印地文字母转换为转义 Unicode 序列的人。

感谢@paskl

【讨论】:

    【解决方案2】:

    除非您希望将此数据作为 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"
    

    编辑:我已经把它变成了一个小的作曲家包,可以在这里找到:

    https://packagist.org/packages/wrossmann/utf8_escape

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-05
      • 2016-04-27
      • 1970-01-01
      • 1970-01-01
      • 2011-05-14
      • 2013-01-18
      • 2012-12-07
      • 2011-02-03
      相关资源
      最近更新 更多