我尝试了很多方法,使用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知之甚少。
提前谢谢。
答案 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-1252
或iso-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。