使用 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];
}