Конвертировать текст на хинди в Escape Eicode с помощью php - PullRequest
0 голосов
/ 29 марта 2019

Я хочу преобразовать текст на хинди / деванагари, например "आए थे पर्यटक, खुद ही बह ग", в символы с экранированием Unicode, такие как "\ u0906 \ u090f \ u0925 \ u092a \ u0930 \ u094d \ u092f \ u091f \ u0915, \ u0916 \ u0926 \ u0939 \ u092c \ u0939 \ u0917 ".

Я занимаюсь разработкой веб-сайта на хинди, и я видел, что большинство сайтов используют последовательность Escaped Unicode внутри своих мета-тегов и schema.org. Поэтому я решил попробовать.

я вижу буквы хинди акаа деванагари с их последовательностью Escaped Unicode на http://www.endmemo.com/unicode/devanagari.php

и я также видел инструмент, который работает так же https://www.mobilefish.com/services/unicode_escape_sequence_converter/unicode_escape_sequence_converter.php

но я не могу найти какой-либо способ конвертировать эти буквы деванагари в последовательность Escaped Unicode через php.

Я пробовал несколько вещей, но ничего не работает, и я не получаю большую помощь от Google, потому что все статьи / форумы говорят о декодировании escape-последовательности Юникода в Юникод, но ни одна из них не касается кодировки ..

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 \ u092a \ u094d \ u092f \ u091f \ u0915, \ u0916 \ u0941 \ u0926 \ u0939 \ u0940 \ u0940 u092c \ u0939 "

Пожалуйста, помогите!

Ответы [ 2 ]

0 голосов
/ 29 марта 2019

Если вы не хотите передавать эти данные в формате JSON, я бы не советовал использовать json_encode(), поскольку он обернет ваш вывод в буквальные двойные кавычки, которые вам нужно будет удалить.Однако в PHP не существует простого способа кодирования escape-кодов Юникода способом, который экономит память.

Тем не менее, вот непростой код:

// 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

0 голосов
/ 29 марта 2019

как подсказывает @paskl, я попробовал:

$message = "आए थे पर्यटक, खुद ही बह गए";
$unicode = json_encode($message)

echo $unicode;

И я получил "" u0906 \ u0925 \ u092a \ u0930 \ u094d \ u092f \ u091f \ u0915, \ u0916 \ u0926 \ u0939 \ u0939 \ u0940 \ u0939 \ u0917 \ u090f " 1004 *

Я надеюсь, что это поможет другим, кто хочет конвертировать буквы деванагари / хинди в последовательность Escaped Unicode с php на их сайте.

Благодаря @ paskl

...