Unicode, сгенерированный методом toEscapedUnicode, без пробелов - PullRequest
2 голосов
/ 04 марта 2010

Для этого слова Un Юникод ==> \u0938\u0941\u0916\u091A\u0948\u0928\u093E\u0928\u0940 \u0930\u0940\u091D\u0941\u092E\u0932 \u091C\u093F\u0935\u0924\u0930\u093E\u092E

и посмотрите, есть ли пробелы перед \u0930 и \u091C

Но когда я пытаюсь в моем коде

String tempString=Strings.toEscapedUnicode(strString); 

Этот метод для преобразования в Unicode дает результат без пробелов: \u0938\u0941\u0916\u091A\u0948\u0928\u093E\u0928\u0940\u0930\u0940\u091D\u0941\u092E\u0932\u091C\u093F\u0935\u0924\u0930\u093E\u092E

и поэтому они не совпадают. Мой метод toEscapeUnicode генерирует Unicode без пробелов. Я хочу пробелы, так как это сделать?

Ответы [ 2 ]

2 голосов
/ 04 марта 2010

Это не полный ответ, но ... когда я копирую и вставляю символы Unicode "चौरेउत्तमयादव", а затем использую несколько инструментов для анализа того, что там, я не вижу пробелов:

echo "चौरेउत्तमयादव " | odx

Это создает шестнадцатеричный дамп данных; в конце есть пробел, но нет в середине.

0x0000: E0 A4 9A E0 A5 8C E0 A4 B0 E0 A5 87 E0 A4 89 E0   ................
0x0010: A4 A4 E0 A5 8D E0 A4 A4 E0 A4 AE E0 A4 AF E0 A4   ................
0x0020: BE E0 A4 A6 E0 A4 B5 20 0A                        ....... .
0x0029:

И вторая команда декодирует данные UTF-8:

echo "चौरेउत्तमयादव " | utf8-unicode

производит:

0xE0 0xA4 0x9A = U+091A
0xE0 0xA5 0x8C = U+094C
0xE0 0xA4 0xB0 = U+0930
0xE0 0xA5 0x87 = U+0947
0xE0 0xA4 0x89 = U+0909
0xE0 0xA4 0xA4 = U+0924
0xE0 0xA5 0x8D = U+094D
0xE0 0xA4 0xA4 = U+0924
0xE0 0xA4 0xAE = U+092E
0xE0 0xA4 0xAF = U+092F
0xE0 0xA4 0xBE = U+093E
0xE0 0xA4 0xA6 = U+0926
0xE0 0xA4 0xB5 = U+0935
0x20 = U+0020
0x0A = U+000A

Итак, похоже, что ваша проблема может быть связана с вводом в 'toEscapedUnicode', а не с его выводом.


Кроме того, похоже, что то, что я копирую и вставляю из вопроса, не соответствует тому, что вы говорите в строке:

Yours     Mine

\u0938    U+091A
\u0941    U+094C
\u0916    U+0930
\u091A    U+0947
\u0948    U+0909
\u0928    U+0924
\u093E    U+094D
\u0928    U+0924
\u0940    U+092E
\u0020
\u0930    U+092F
\u0940    U+093E
\u091D    U+0926
\u0941    U+0935
\u092E
\u0932
\u0020
\u091C
\u093F
\u0935
\u0924

Таким образом, вставленный текст не соответствует заявленному переводу и по другим причинам.


Я считаю, что указанная вами строка Unicode должна выглядеть следующим образом:

सुखचैनानी रीझुमल जिवतराम

Я использовал файл, содержащий указанные вами значения, за вычетом префиксов \u и вместо пробелов 0020:

0938
0941
0916
091A
0948
0928
093E
0928
0940
0020
0930
0940
091D
0941
092E
0932
0020
091C
093F
0935
0924
0930
093E
092E

И затем я использовал этот чистый Perl-сценарий домашнего приготовления для генерации строки UTF-8, которую я предлагаю в качестве эквивалента вашей экранированной строки Unicode. Я уверен, что в Perl есть механизмы, позволяющие сделать это иначе (используя модули, связанные с Unicode), но это сработало для меня. Было бы менее многословно, если бы я не оставил там код отладки):

#!/bin/perl -w

use strict;
use constant debug => 0;

while (<>)
{
    chomp;
    my $i = hex;
    printf STDERR "0x%04X = %4d\n", $i, $i if debug;
    if ($i < 0x100)
    {
        # 1-byte UTF-8
        printf STDERR "  0x%02X (%3d)\n", $i, $i if debug;
        printf "%c", $i;
    }
    elsif ($i < 0x800)
    {
        # 2-byte UTF-8
        my($b1) = 0xC0 | (($i >> 6) & 0xFF);
        my($b2) = 0x80 | ($i & 0x3F);
        printf STDERR "  0x%02X (%3d)\n", $b1, $b1 if debug;
        printf STDERR "  0x%02X (%3d)\n", $b2, $b2 if debug;
        printf "%c%c", $b1, $b2;
    }
    elsif ($i < 0x10000)
    {
        # 3-byte UTF-8
        my($b1) = 0xE0 | (($i >> 12) & 0xFF);
        my($b2) = 0x80 | (($i >>  6) & 0x3F);
        my($b3) = 0x80 | ( $i        & 0x3F);
        printf STDERR "  0x%02X (%3d)\n", $b1, $b1 if debug;
        printf STDERR "  0x%02X (%3d)\n", $b2, $b2 if debug;
        printf STDERR "  0x%02X (%3d)\n", $b3, $b3 if debug;
        printf "%c%c%c", $b1, $b2, $b3;
    }
    else
    {
        # 4-byte UTF-8 or error
        die "Oh bother!";
    }
}
print "\n";

Вы можете заполнить 4-байтовый код UTF-8 и обработать ошибки. Я не диагностирую недопустимые последовательности UTF-8 (особенно суррогаты UTF-16), поэтому, если вы введете фиктивные точки данных Unicode, вы получите фиктивные значения UTF-8 из сценария. Если вам нужно больше узнать об этом, прочитайте главу 3 книги по Unicode (доступна для скачивания - в виде главы - с Unicode.org ) или FAQ - UTF-8, UTF-16 , UTF-32 и BOM .

0 голосов
/ 14 сентября 2017

У меня была похожая ситуация, когда мне приходилось отображать данные примерно так "\ U0928 \ U093e \ U0936 \ U092a \ U093e \ U0924 \ U0940", которое должно быть नाशपाती

Я много искал, чтобы преобразовать его, но ответ, который я нашел сам, был очень прост и легок.

Только мне нужно было поместить данную строку из JSON в UILabel или что-нибудь еще, что вы захотите. В моем случае это было примерно так:

let meaning = array[indexPath.row] as! NSDictionary
cell.textLabel?.text = meaning.value(forKey: "key") as? String
...