4

我正在尝试做一件简单的事情 - 获取我所有的专辑。问题是专辑名称不是英语(它们是希伯来语)。

检索相册的代码:

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 ?

我能做些什么来解决这个问题?

提前致谢。

4

4 回答 4

5

这就是 Unicode 在JSON中的表示方式(参见char边栏中的定义)。它们是转义序列,其中四个十六进制数字是字符的 Unicode 代码点。请注意,由于只有四个可用的十六进制数字,因此只有BMP中的 Unicode 字符可以用 JSON 表示。

任何体面的 JSON 解析器都会为您将这些 Unicode 转义序列转换为正确编码的字符——前提是目标编码首先支持该字符。

于 2010-09-27T19:06:27.397 回答
1

我在使用 Facebook Graph Api 时遇到了同样的问题,并且转义了 unicode 罗马尼亚字符。我使用过 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);

如果您直接在 html 中声明字符集,则方法 2(PHP)和可能也有效:

header('content-type:text/html;charset=utf-8');
于 2015-07-19T17:12:12.537 回答
0

这些是 Unicode 字符代码。\u 序列告诉解析器接下来的 4 个字符实际上是一个 unicode 字符编号。这些字符的外观取决于您的字体,如果有人没有正确的字体,它们可能只是显示为很多方框。就我所知,Unicode 很复杂。

于 2010-09-27T18:21:46.473 回答
0

对于希伯来语文本,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));
于 2020-12-23T21:52:54.640 回答