如何使用LitJSON从JSON文件中提取UTF-8字符串,因为JsonData似乎没有转换?

时间:2017-07-28 23:01:04

标签: c# json unity3d utf-8 litjson

我尝试了很多方法,使用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知之甚少。

提前谢谢。

1 个答案:

答案 0 :(得分:1)

当使用一种编码写入文本文件并使用另一种编码读取文本文件时,会出现此类问题。我能够使用以下程序重现您的问题,该程序完全从等式中删除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文件不是以编程方式创建的,而是用手写的#34;,这意味着你使用记事本或其他文本编辑器来制作文件。如果是这样,那么这就解释了你是如何陷入这种情况的。保存文件时,您应该可以选择编码。至少对于记事本,默认编码是" ANSI",它很可能映射到Windows-1252(西欧),但取决于您的语言环境。例如,如果你在波罗的海地区,它将是Windows-1257(波罗的海)。在任何情况下," ANSI"是 UTF-8。如果要以UTF-8编码保存文件,则必须专门选择该选项。无论您使用什么选项来保存文件,这都是您下次需要使用的编码,无论是使用文本编辑器还是使用代码。 使用错误的编码来读取文件是导致损坏的原因。

更改文件的编码,首先必须使用与最初保存的编码相同的编码来读取它,然后您可以使用不同的编码将其写回。您可以使用文本编辑器,只需使用不同的编码重新保存文件,或者您可以通过编程方式执行此操作:

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

关键是要知道最初使用了哪种编码,其中存在着问题。对于遗留编码(例如Windows-12xx),无法分辨,因为文件中没有标识它的标记。另一方面,Unicode编码(例如UTF-8,UTF-16)在文件的开头写出一个标记,称为BOM,或字节顺序标记< / em>,可以通过编程方式检测到。再加上Unicode编码可以代表所有字符的事实,这就是为什么它们比传统编码更受欢迎。

有关详细信息,我强烈建议您阅读What Every Programmer Absolutely, Positively Needs To Know About Encodings And Character Sets To Work With Text