Facebook Graph API — названия альбомов не на английском языке

Я пытаюсь сделать простую вещь - получить все свои альбомы. проблема в том, что названия альбомов не английские (они на иврите).

Код, который извлекает альбомы:

string query = "https://graph.facebook.com/me/albums?access_token=...";
string result = webClient.DownloadString(query);

А вот так выглядит один из возвращенных альбомов:

{
     "id": "410329886431",
     "from": {
        "name": "Noam Levinson",
        "id": "500786431"
     },
     "name": "\u05ea\u05e2\u05e8\u05d5\u05db\u05ea \u05d2\u05de\u05e8 \u05e9\u05e0\u05d4 \u05d0",
     "location": "\u05e9\u05e0\u05e7\u05e8",
     "link": "http://www.facebook.com/album.php?aid=193564&id=500786431",
     "count": 27,
     "type": "normal",
     "created_time": "2010-07-18T06:20:27+0000",
     "updated_time": "2010-07-18T09:29:34+0000"
  },

Как видите, проблема в свойстве «имя». Вместо букв иврита я получаю эти коды (эти коды не мусор, они последовательны - каждый код, вероятно, представляет одну букву иврита). Вопрос в том, как я могу преобразовать эти коды в язык, отличный от английского (в моем случае, в иврит). Или, может быть, проблема в том, как я получаю альбомы с помощью объекта webClient. может быть, как-то изменить webclient.Encoding?

что я могу сделать, чтобы решить эту проблему?

Заранее спасибо.


person Yaron Levi    schedule 27.09.2010    source источник


Ответы (4)


Вот как Unicode представлен в JSON (см. определение char на боковой панели). Это escape-последовательности, в которых четыре шестнадцатеричных цифры являются кодовой точкой Unicode символа. Обратите внимание, что поскольку доступно только четыре шестнадцатеричных цифры, могут быть представлены только символы Юникода из BMP. в JSON.

Любой достойный синтаксический анализатор JSON преобразует эти escape-последовательности Unicode в правильно закодированные символы для вас - при условии, что целевая кодировка поддерживает символ в первую очередь.

person Peter Bailey    schedule 27.09.2010

У меня была такая же проблема с Facebook Graph Api и экранированными румынскими символами Юникода. Я использовал PHP, но вы, вероятно, можете перевести метод regexp в javascript.

Способ 1 (PHP):

$str = "\u05ea\u05e2\u05e8\u05d5\u05db\u05ea";
function esc_unicode2html($string) {
    return preg_replace('/\\\\u([0-9a-z]{4})/', '&#x$1;', $string);
}
echo esc_unicode2html($str);

Метод 2 (PHP) и, возможно, он работает, если вы объявляете кодировку непосредственно в html:

header('content-type:text/html;charset=utf-8');
person crisc2000    schedule 19.07.2015

Это коды символов Unicode. Последовательность \u сообщает синтаксическому анализатору, что следующие 4 символа на самом деле образуют номер символа Юникода. Как будут выглядеть эти символы, зависит от вашего шрифта. Если у кого-то нет правильного шрифта, они могут просто отображаться в виде множества квадратных прямоугольников. Насколько я знаю, Unicode сложен.

person James    schedule 27.09.2010

Для текстов на иврите этот код на PHP решит проблему:

    $str = '\u05ea\u05e2\u05e8\u05d5\u05db\u05ea \u05d2\u05de\u05e8 \u05e9\u05e0\u05d4 \u05d0';

    function decode_encoded_utf8($string){
        return preg_replace_callback('#\\\\u([0-9a-f]{4})#ism', function($matches) { return mb_convert_encoding(pack("H*", $matches[1]), "UTF-8", "UCS-2BE"); }, $string);
    }
    echo decode_encoded_utf8($str); // will show (תערוכת גמר שנה א) text

Для арабских текстов используйте это:

$str = '\u00d8\u00ae\u00d9\u0084\u00d8\u00b5';

function decode_encoded_utf8($string){
    return preg_replace_callback('#\\\\u([0-9a-f]{4})#ism', function($matches) { return mb_convert_encoding(pack("H*", $matches[1]), "UTF-8", "UCS-2BE"); }, $string);
}
echo iconv("UTF-8", "ISO-8859-1//TRANSLIT", decode_encoded_utf8($str));
person AnasSafi    schedule 23.12.2020