使用php

时间:2019-03-29 13:25:12

标签: php unicode unicode-escapes

我想将印地文/梵文文本(例如“आएपर्यटक,खुदबहग”)转换为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“

请帮助!

2 个答案:

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

编辑:我已将其变成一个小的作曲家程序包,可在此处使用:

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