使用 CultureInfo 将字符代码转换为字符 C#
Converting character code to character C# using CultureInfo
我在 C# 项目中使用 阿拉伯语 CultureInfo
。在一个地方,如果我 select 的语言是 English,那么我使用 Strings.Chr(chrCode)
将字符代码转换为字符 工作正常,除了英语,它还返回一些 特殊字符 。
如果我选择 Arabic CultureInfo
它将返回 Arabic characters 而不是英文字符。
请建议我在选择其他时如何获取英文字符CultureInfo
。
您是否正在寻找 Win-1256 code page (Strings.Chr 无法使用 使用 Unicode,但使用代码页)?
// From arabic letter Ḍād to its one byte code (Win-1256)
byte code = Encoding.GetEncoding(1256).GetBytes("\u0636")[0];
// From code back to arabic letter
char back = Encoding.GetEncoding(1256).GetString(new byte[] { code })[0];
Console.WriteLine($"{back} == {code} (\u{(int)back:x4})");
如果你想把它包装成一个方法:
private static char ArabicChr(int chrCode) {
if (chrCode < byte.MinValue || chrCode > byte.MaxValue)
throw new ArgumentOutOfRangeException(
"chrCode",
$"chrCode must be in [{byte.MinValue}..{byte.MaxValue}] range");
return Encoding.GetEncoding(1256).GetString(new byte[] { (byte)chrCode })[0];
}
结果:
ض == 214 (\u0636)
编辑:如果你想获得英文字符,你可以尝试使用Win-1252代码页:
private static char EnglishChr(int chrCode) {
if (chrCode < byte.MinValue || chrCode > byte.MaxValue)
throw new ArgumentOutOfRangeException(
"chrCode",
$"chrCode must be in [{byte.MinValue}..{byte.MaxValue}] range");
return Encoding.GetEncoding(1252).GetString(new byte[] { (byte)chrCode })[0];
}
在一般情况下,如果您有文化名称,例如"en-US"
:
private static char Chr(int chrCode, string cultureName = "en-US") {
if (chrCode < byte.MinValue || chrCode > byte.MaxValue)
throw new ArgumentOutOfRangeException(
"chrCode",
$"chrCode must be in [{byte.MinValue}..{byte.MaxValue}] range");
int page = CultureInfo.GetCultureInfo(cultureName).TextInfo.ANSICodePage;
return Encoding.GetEncoding(page).GetString(new byte[] { (byte)chrCode })[0];
}
我在 C# 项目中使用 阿拉伯语 CultureInfo
。在一个地方,如果我 select 的语言是 English,那么我使用 Strings.Chr(chrCode)
将字符代码转换为字符 工作正常,除了英语,它还返回一些 特殊字符 。
如果我选择 Arabic CultureInfo
它将返回 Arabic characters 而不是英文字符。
请建议我在选择其他时如何获取英文字符CultureInfo
。
您是否正在寻找 Win-1256 code page (Strings.Chr 无法使用 使用 Unicode,但使用代码页)?
// From arabic letter Ḍād to its one byte code (Win-1256)
byte code = Encoding.GetEncoding(1256).GetBytes("\u0636")[0];
// From code back to arabic letter
char back = Encoding.GetEncoding(1256).GetString(new byte[] { code })[0];
Console.WriteLine($"{back} == {code} (\u{(int)back:x4})");
如果你想把它包装成一个方法:
private static char ArabicChr(int chrCode) {
if (chrCode < byte.MinValue || chrCode > byte.MaxValue)
throw new ArgumentOutOfRangeException(
"chrCode",
$"chrCode must be in [{byte.MinValue}..{byte.MaxValue}] range");
return Encoding.GetEncoding(1256).GetString(new byte[] { (byte)chrCode })[0];
}
结果:
ض == 214 (\u0636)
编辑:如果你想获得英文字符,你可以尝试使用Win-1252代码页:
private static char EnglishChr(int chrCode) {
if (chrCode < byte.MinValue || chrCode > byte.MaxValue)
throw new ArgumentOutOfRangeException(
"chrCode",
$"chrCode must be in [{byte.MinValue}..{byte.MaxValue}] range");
return Encoding.GetEncoding(1252).GetString(new byte[] { (byte)chrCode })[0];
}
在一般情况下,如果您有文化名称,例如"en-US"
:
private static char Chr(int chrCode, string cultureName = "en-US") {
if (chrCode < byte.MinValue || chrCode > byte.MaxValue)
throw new ArgumentOutOfRangeException(
"chrCode",
$"chrCode must be in [{byte.MinValue}..{byte.MaxValue}] range");
int page = CultureInfo.GetCultureInfo(cultureName).TextInfo.ANSICodePage;
return Encoding.GetEncoding(page).GetString(new byte[] { (byte)chrCode })[0];
}