我已经尝试过许多方法,使用LitJson在Unity中从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了解得不够。
提前谢谢你。
发布于 2017-07-29 05:15:39
当使用一种编码编写文本文件并使用另一种编码读取文本文件时,会发生这种类型的问题。我能够用以下程序重现您的问题,该程序将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文件不是以编程方式创建的,而是“手工编写的”,这意味着您使用记事本或其他文本编辑器来创建该文件。如果是这样的话,那就解释了你是如何陷入这种情况的。保存文件时,应该可以选择编码。至少对于记事本来说,默认编码是"ANSI",这很可能映射到Windows1252(西欧),但取决于您的地区。例如,如果您在波罗的海地区,它将是Windows1257(波罗的海)。无论如何,"ANSI“是而不是 UTF-8。如果要以UTF-8编码保存文件,则必须具体选择该选项。无论您使用什么选项来保存文件,也就是您下次读取该文件所需的编码,无论是使用文本编辑器还是使用代码。使用错误的编码读取文件是导致损坏的原因。
若要更改文件的编码,首先必须使用与最初保存的文件相同的编码方式读取文件,然后可以使用不同的编码将其写回。您可以使用文本编辑器执行此操作,只需使用不同的编码重新保存文件,也可以通过编程方式这样做:
string text = File.ReadAllText(file, originalEncoding);
File.WriteAllText(file, text, newEncoding); 关键是知道最初使用的是哪种编码,而其中的难点就在于此。对于遗留编码(如Windows12xx),无法判断,因为文件中没有标识它的标记。另一方面,Unicode编码(例如UTF-8,UTF-16)在文件开头写一个标记,称为BOM,或字节顺序标记,这些标记可以编程地检测到。这再加上Unicode编码可以表示所有字符的事实,这就是为什么它们比遗留编码更受欢迎的原因。
有关更多信息,我强烈建议您阅读每个程序员绝对、积极地需要了解编码和字符集才能处理文本。。
https://stackoverflow.com/questions/45383518
复制相似问题