我如何使用 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-1252
或 iso-8859-1
而不是 UTF-8
创建的。阅读文件时尝试使用其中之一,例如:
string jsonString = File.ReadAllText(Application.dataPath + pathName,
Encoding.GetEncoding("Windows-1252"));
您在评论中说您的 JSON 文件不是以编程方式创建的,而是 "written by hand",这意味着您使用记事本或其他文本编辑器创建了该文件。如果是这样,那么这就解释了你是如何陷入这种情况的。保存文件时,您应该可以选择编码。至少对于记事本,默认编码是 "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)do 在文件开头写一个标记,称为 BOM,或 字节顺序标记,可以通过编程方式检测。再加上 Unicode 编码可以表示所有字符,这就是为什么它们比传统编码更受青睐的原因。
有关更多信息,我强烈建议阅读 What Every Programmer Absolutely, Positively Needs To Know About Encodings And Character Sets To Work With Text。
我尝试了很多方法在 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-1252
或 iso-8859-1
而不是 UTF-8
创建的。阅读文件时尝试使用其中之一,例如:
string jsonString = File.ReadAllText(Application.dataPath + pathName,
Encoding.GetEncoding("Windows-1252"));
您在评论中说您的 JSON 文件不是以编程方式创建的,而是 "written by hand",这意味着您使用记事本或其他文本编辑器创建了该文件。如果是这样,那么这就解释了你是如何陷入这种情况的。保存文件时,您应该可以选择编码。至少对于记事本,默认编码是 "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)do 在文件开头写一个标记,称为 BOM,或 字节顺序标记,可以通过编程方式检测。再加上 Unicode 编码可以表示所有字符,这就是为什么它们比传统编码更受青睐的原因。
有关更多信息,我强烈建议阅读 What Every Programmer Absolutely, Positively Needs To Know About Encodings And Character Sets To Work With Text。