Вывод C # UTF8 сохраняет закодированные символы без изменений - PullRequest
3 голосов
/ 30 мая 2010

У меня очень простой вопрос, который я не могу понять.

У меня есть правильно закодированная строка UTF8. Я анализирую в JObject с Json.NET, перебираю некоторые значения и записываю его в командную строку, сохраняя закодированные символы без изменений.

Все отлично работает, за исключением сохранения неповрежденной части закодированных символов.

Код:

var json = "{roster: [[\"Tulg\u00f4r\", 990, 1055]]}";
var j = JObject.Parse(json);
for (int i = 0; i < j["roster"].Count(); i++)
{
    j["roster"][i][1] = ((int)j["roster"][i][1]) * 3;
    j["roster"][i][2] = ((int)j["roster"][i][2]) * 3;
}
Console.WriteLine(JsonConvert.SerializeObject(j, Formatting.None));

Фактический объем производства:

{"roster":[["Tulgôr",2970,3165]]}

Желаемый вывод:

{"roster":[["Tulg\u00f4r",2970,3165]]}

Кажется, что мои фразы в Google неуместны, так как ничего полезного не пришло. Я уверен, что это что-то очень простое, и потом я буду чувствовать себя довольно глупо. :)

Ответы [ 2 ]

4 голосов
/ 30 мая 2010

Возьмите выходные данные из JsonConvert.SerializeObject и запустите его с помощью вспомогательного метода, который преобразует все символы не ASCII в их экранированный ("\ uHHHH") эквивалент. Пример реализации приведен ниже.

// Replaces non-ASCII with escape sequences;
// i.e., converts "Tulgôr" to "Tulg\u00f4r".
private static string EscapeUnicode(string input)
{
    StringBuilder sb = new StringBuilder(input.Length);
    foreach (char ch in input)
    {
        if (ch <= 0x7f)
            sb.Append(ch);
        else
            sb.AppendFormat(CultureInfo.InvariantCulture, "\\u{0:x4}", (int) ch);
    }
    return sb.ToString();
}

Вы бы назвали это следующим образом:

Console.WriteLine(EscapeUnicode(JsonConvert.SerializeObject(j, Formatting.None)));

(Обратите внимание, что я специально не обрабатываю символы, отличные от BMP, потому что не знаю, хочет ли ваше стороннее приложение "\ U00010000" или "\ uD800 \ uDC00" (или что-то еще!) При представлении U +10000.)

1 голос
/ 30 мая 2010

Я не уверен, что вижу здесь проблему. Фактический вывод содержит символ Unicode, он корректно интерпретируется после указания с использованием синтаксиса \ u. Он содержит правильный символ, поэтому содержит правильные «байты». Конечно, это будет строка .Net, поэтому Unicode, а не UTF-8.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...