2010-05-29 66 views
3

我有一個非常簡單的問題,我似乎無法得到我的頭。C#UTF8輸出保持編碼字符不變

我有一個正確編碼的UTF8字符串,我用Json.NET解析成一個JObject,擺弄一些值並寫入命令行,保持編碼字符不變。

除了保持編碼字符完整的部分之外,一切都很好。

代碼:

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]]} 

好像我在谷歌的措辭是不合適的,因爲沒有什麼用處了上來。我確信這是一件非常簡單的事情,之後我會覺得很愚蠢。 :)

回答

3

從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

我不確定我在這裏看到問題。實際輸出包含unicode字符,在使用\ u語法指定後正確解釋。它包含正確的字符,因此包含正確的「字節」。當然,它將是一個如此Unicode的.Net字符串,而不是UTF-8。

+0

正確,但我不希望在輸出中解釋字符。我想在命令行上看到unicode表示,所以我可以將結果字符串複製粘貼到需要\ u的第三方應用程序中,因爲它似乎不能正確解析輸入。 – 2010-05-30 01:28:36

+0

好的,它看起來像你的第三方應用程序期待ASCII或UTF-8。當你複製和粘貼你將複製和粘貼UTF-16。你想要的是ASCII轉義編碼的Unicode。 @布拉德利的答案應該可以解決問題。 – 2010-05-30 10:24:34