簡體   English   中英

我如何使用LitJSON從JSON文件中提取UTF-8字符串,因為JsonData似乎沒有轉換?

[英]How do I extract UTF-8 strings out of a JSON file using LitJSON, as JsonData does not seem to convert?

我嘗試了很多方法,使用Unity中的LitJson從JSON文件中提取一些字符串。

我已經進行了編碼轉換,嘗試獲取字節數組並將其發送到周圍,但似乎沒有任何效果。

我去了創建JsonData對象的最開始,並嘗試運行以下測試:

public JsonData CreateJSONDataObject()
{
    Debug.Assert(pathName != null, "No JSON Data path name set. Please set before commencing read.");
    string jsonString = File.ReadAllText(Application.dataPath + pathName, System.Text.Encoding.UTF8);        
    JsonData jsonDataObject = JsonMapper.ToObject(jsonString);
    Debug.Log("Test compatibility: ë | " + jsonDataObject["Roots"][2]["name"]);
    return jsonDataObject;
}

我確保我的jsonString使用的是UTF-8,但是輸出顯示了這一點:

Test compatibility: ë | W�den

我已經嘗試了許多其他方法,但是由於這確保了在創建JsonData對象時正確編碼,所以我想不出我做錯了什么,因為我對JSON不夠了解。

先感謝您。

當使用一種編碼編寫文本文件並使用另一種編碼讀取文本文件時,會發生這種類型的問題。 我可以使用以下程序重現您的問題,該程序從等式中完全刪除了JSON序列化:

string file = @"c:\temp\test.txt";
string text = "Wöden";
File.WriteAllText(file, text, Encoding.Default));
string text2 = File.ReadAllText(file, Encoding.UTF8);
Debug.WriteLine(text2);

由於您正在使用UTF-8進行閱讀並且無法正常工作,所以真正的問題是,最初使用哪種編碼來寫入文件? 您應該使用相同的編碼將其讀回。 我懷疑該文件最初是使用Windows-1252iso-8859-1而不是UTF-8 讀取文件時嘗試使用其中之一,例如:

string jsonString = File.ReadAllText(Application.dataPath + pathName,
                                     Encoding.GetEncoding("Windows-1252"));

您在評論中說,您的JSON文件不是通過程序創建的,而是“手動編寫的”,這意味着您使用記事本或其他文本編輯器來制作該文件。 如果是這樣,那就說明您是如何陷入這種情況的。 保存文件時,應該可以選擇編碼。 至少對於記事本,默認編碼為“ ANSI”,它最有可能映射到Windows-1252(西歐),但取決於您的語言環境。 例如,如果您位於波羅的海地區,則為Windows-1257(Baltic)。 無論如何,“ ANSI” 都不是UTF-8。 如果要以UTF-8編碼保存文件,則必須專門選擇該選項。 用於保存文件的任何選項,即下次使用它需要使用的編碼方式,無論是使用文本編輯器還是使用代碼。 使用錯誤的編碼來讀取文件是導致損壞的原因。

更改文件的編碼,首先必須使用與原始保存相同的編碼讀取文件,然后可以使用其他編碼將其寫回。 您可以使用文本編輯器來做到這一點,只需使用不同的編碼重新保存文件,或者您可以通過編程方式做到這一點:

string text = File.ReadAllText(file, originalEncoding);
File.WriteAllText(file, text, newEncoding); 

關鍵是要知道最初使用的是哪種編碼,然后才是關鍵所在。 對於舊版編碼(例如Windows-12xx),無法分辨,因為文件中沒有標識它的標記。 另一方面,Unicode編碼(例如UTF-8,UTF-16) 確實在文件的開頭寫了一個稱為BOM的標記 ,即字節序標記 ,可以通過編程方式對其進行檢測。 加上Unicode編碼可以代表所有字符的事實,這就是為什么它們比傳統編碼更受青睞的原因。

有關更多信息,我強烈建議閱讀每個程序員絕對肯定要了解與文本配合使用的編碼和字符集的內容

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM