在工具中显示俄语文本的问题。 (UTF8)
Problem of displaying Russian texts in a tool. (UTF8)
从昨天开始,我在其中一个工具中显示俄语文本时遇到了问题。
我使用了以下代码,它显示了项目的名称:
public static string LocalizedName(LocalizedNames localizedNames, string currentLanguage = null, string alternativeName = "NO_ITEM_NAME")
{
if (localizedNames == null)
return alternativeName;
if (string.IsNullOrEmpty(currentLanguage))
currentLanguage = LanguageController.CurrentCultureInfo.TextInfo.CultureName.ToUpper();
switch (FrequentlyValues.GameLanguages.FirstOrDefault(x => string.Equals(x.Value, currentLanguage, StringComparison.CurrentCultureIgnoreCase)).Key)
{
case GameLanguage.UnitedStates:
return Encoding.UTF8.GetString(Encoding.Default.GetBytes(localizedNames.EnUs ?? alternativeName));
case GameLanguage.Germany:
return Encoding.UTF8.GetString(Encoding.Default.GetBytes(localizedNames.DeDe ?? alternativeName));
case GameLanguage.Russia:
return Encoding.UTF8.GetString(Encoding.Default.GetBytes(localizedNames.RuRu ?? alternativeName));
case GameLanguage.Poland:
return Encoding.UTF8.GetString(Encoding.Default.GetBytes(localizedNames.PlPl ?? alternativeName));
case GameLanguage.Brazil:
return Encoding.UTF8.GetString(Encoding.Default.GetBytes(localizedNames.PtBr ?? alternativeName));
case GameLanguage.France:
return Encoding.UTF8.GetString(Encoding.Default.GetBytes(localizedNames.FrFr ?? alternativeName));
case GameLanguage.Spain:
return Encoding.UTF8.GetString(Encoding.Default.GetBytes(localizedNames.EsEs ?? alternativeName));
case GameLanguage.Chinese:
return Encoding.UTF8.GetString(Encoding.Default.GetBytes(localizedNames.ZhCn ?? alternativeName));
default:
return alternativeName;
}
}
这里有一个link工具,测试一下:https://github.com/Triky313/AlbionOnline-StatisticsAnalysis
对我来说,所有语言都正确显示(德国),但俄罗斯的其他人只能看到错误文本。
编辑:
这是项目列表文件的一部分:
` "LocalizedNames": {
"EN-US": "Hideout Construction Kit",
"DE-DE": "Unterschlupf-Baukasten",
"FR-FR": "Kit de construction de repaire",
"RU-RU": "Ðабор Ð´Ð»Ñ Ð¿Ð¾Ñтройки убежища",
"PL-PL": "Zestaw do budowy Kryjówki",
"ES-ES": "Kit de construcción de Escondites",
"PT-BR": "Kit de Construção de Esconderijo",
"ZH-CN": "è—èº«åœ°å ¡å»ºç‘工具包",
"KO-KR": "ì€ì‹ 처 건설키트" }, `
文件将从这里下载 url:
https://raw.githubusercontent.com/broderickhyman/ao-bin-dumps/master/formatted/items.json
有人知道我该如何解决这个问题吗?
问题出在别处。文件保存为 UTF8,默认情况下没有。
File.WriteAllText($"{AppDomain.CurrentDomain.BaseDirectory}{Settings.Default.ItemListFileName}", itemsString, Encoding.Default);
在 Encoding.UTF8.
之前
感谢您的帮助。 :)
您的代码所做的是将 .NET 编码的字符串作为 UTF-16,将其转换为计算机的 ANSI 编码 (= Encoding.Default) 字节,然后将其解码为 UTF-8。此往返只会为 UTF-8 的公共子集和您的 ANSI 编码产生有效结果,它们是由英文字母和数字组成的低 128 code-points。俄语、中文、韩语等之外的所有内容都会变成乱码。
您的来源是 JSON 存储为 UTF-8 的文件。
但是在您的代码中您使用 WebClient.DownloadStringTaskAsync which uses WebClient.Encoding to decide how to convert the downloaded stream to a string. The documentation writes that it defaults to Encoding.Default
which is generally bad as this depends on how your computer is configured. On a computer with a German locale Encoding.Default
is Windows-1252/ISO-8859-15, on an English locale its ISO-8859-1, on a Russian computer its probably KOI8R, and so on. This means that code that uses Encoding.Default
is not portable and even the documentation warns not to use it。
要解决此问题,请将 WebClient.Encoding
设置为 Encoding.UTF8
。或者更好:改用 HttpClient,因为 WebClient 已弃用近 10 年了。
之后删除所有编码实例。UTF8.GetString(Encoding.Default.GetBytes(...)),因为不再需要这些。
从昨天开始,我在其中一个工具中显示俄语文本时遇到了问题。
我使用了以下代码,它显示了项目的名称:
public static string LocalizedName(LocalizedNames localizedNames, string currentLanguage = null, string alternativeName = "NO_ITEM_NAME")
{
if (localizedNames == null)
return alternativeName;
if (string.IsNullOrEmpty(currentLanguage))
currentLanguage = LanguageController.CurrentCultureInfo.TextInfo.CultureName.ToUpper();
switch (FrequentlyValues.GameLanguages.FirstOrDefault(x => string.Equals(x.Value, currentLanguage, StringComparison.CurrentCultureIgnoreCase)).Key)
{
case GameLanguage.UnitedStates:
return Encoding.UTF8.GetString(Encoding.Default.GetBytes(localizedNames.EnUs ?? alternativeName));
case GameLanguage.Germany:
return Encoding.UTF8.GetString(Encoding.Default.GetBytes(localizedNames.DeDe ?? alternativeName));
case GameLanguage.Russia:
return Encoding.UTF8.GetString(Encoding.Default.GetBytes(localizedNames.RuRu ?? alternativeName));
case GameLanguage.Poland:
return Encoding.UTF8.GetString(Encoding.Default.GetBytes(localizedNames.PlPl ?? alternativeName));
case GameLanguage.Brazil:
return Encoding.UTF8.GetString(Encoding.Default.GetBytes(localizedNames.PtBr ?? alternativeName));
case GameLanguage.France:
return Encoding.UTF8.GetString(Encoding.Default.GetBytes(localizedNames.FrFr ?? alternativeName));
case GameLanguage.Spain:
return Encoding.UTF8.GetString(Encoding.Default.GetBytes(localizedNames.EsEs ?? alternativeName));
case GameLanguage.Chinese:
return Encoding.UTF8.GetString(Encoding.Default.GetBytes(localizedNames.ZhCn ?? alternativeName));
default:
return alternativeName;
}
}
这里有一个link工具,测试一下:https://github.com/Triky313/AlbionOnline-StatisticsAnalysis
对我来说,所有语言都正确显示(德国),但俄罗斯的其他人只能看到错误文本。
编辑: 这是项目列表文件的一部分:
` "LocalizedNames": {
"EN-US": "Hideout Construction Kit",
"DE-DE": "Unterschlupf-Baukasten",
"FR-FR": "Kit de construction de repaire",
"RU-RU": "Ðабор Ð´Ð»Ñ Ð¿Ð¾Ñтройки убежища",
"PL-PL": "Zestaw do budowy Kryjówki",
"ES-ES": "Kit de construcción de Escondites",
"PT-BR": "Kit de Construção de Esconderijo",
"ZH-CN": "è—èº«åœ°å ¡å»ºç‘工具包",
"KO-KR": "ì€ì‹ 처 건설키트" }, `
文件将从这里下载 url:
https://raw.githubusercontent.com/broderickhyman/ao-bin-dumps/master/formatted/items.json
有人知道我该如何解决这个问题吗?
问题出在别处。文件保存为 UTF8,默认情况下没有。
File.WriteAllText($"{AppDomain.CurrentDomain.BaseDirectory}{Settings.Default.ItemListFileName}", itemsString, Encoding.Default);
在 Encoding.UTF8.
之前感谢您的帮助。 :)
您的代码所做的是将 .NET 编码的字符串作为 UTF-16,将其转换为计算机的 ANSI 编码 (= Encoding.Default) 字节,然后将其解码为 UTF-8。此往返只会为 UTF-8 的公共子集和您的 ANSI 编码产生有效结果,它们是由英文字母和数字组成的低 128 code-points。俄语、中文、韩语等之外的所有内容都会变成乱码。
您的来源是 JSON 存储为 UTF-8 的文件。
但是在您的代码中您使用 WebClient.DownloadStringTaskAsync which uses WebClient.Encoding to decide how to convert the downloaded stream to a string. The documentation writes that it defaults to Encoding.Default
which is generally bad as this depends on how your computer is configured. On a computer with a German locale Encoding.Default
is Windows-1252/ISO-8859-15, on an English locale its ISO-8859-1, on a Russian computer its probably KOI8R, and so on. This means that code that uses Encoding.Default
is not portable and even the documentation warns not to use it。
要解决此问题,请将 WebClient.Encoding
设置为 Encoding.UTF8
。或者更好:改用 HttpClient,因为 WebClient 已弃用近 10 年了。
之后删除所有编码实例。UTF8.GetString(Encoding.Default.GetBytes(...)),因为不再需要这些。