【问题标题】:Encoding Char From a String从字符串编码字符
【发布时间】:2017-12-09 23:01:56
【问题描述】:

我有一个字符串

"\u00c7"

我可以把它转换成代码;

char chr = Convert.ToChar("\u00c7"); // value of the chr is **Ç**

但我不能这样转换

我在 textbox1 中写了 \u00c7

char chr2 = Convert.ToChar(textbox1.Text); //This makes an error - number of character

我为此工作了几个小时,但找不到任何解决方案。

【问题讨论】:

  • 如果您在控制台窗口中运行,这实际上可以工作,我将发布一个您可以在控制台中运行的示例,您将看到
  • 如果我理解正确,您在文本框中输入了\u00c7?如果是这样,这与在代码中以这种方式编写它不同,因为反斜杠是转义字符。在代码中,如果您键入 \u,这意味着下一个字符是 Unicode 代码点,编译器应将整个序列转换为单个字符。在文本框中,您实际上是在写一个反斜杠,后跟一个 u 和一些数字/字母,所以这里实际上是一个由六个字符组成的序列。如果您通过在代码中写入"\\u00c7"@"\u00c7" 来禁用转义,也会发生同样的情况。
  • 一般来说,人类在文本框中输入 C# 语法并没有什么特别的原因。您确定他们想要输入任何计算机语言的文字字符串语法吗?他们为什么不像平常那​​样使用他们使用的任何键盘、操作系统和 IME 或其他辅助实用程序来键入文本?
  • @ckuri \u 用于 UTF-16 代码单元。 C# 没有像 JavaScript 和 HTML 这样的 Unicode 代码点的转义符。
  • 或者,您可以接受HTML character entity references。 Ç Ç 🚲 ???有 .NET 库可以对它们进行解码,一些用户更熟悉它们。

标签: c# .net c#-4.0 encoding character-encoding


【解决方案1】:

没有内置的方法可以做到这一点(转义序列仅在编译时解析),但自己解析字符串相当容易:

static bool TryParseAsChar(this string s, out char c)
{
    if (s != null)
    {
        if (s.Length == 1)
        {
            c = s[0];
            return true;
        }

        if (s.StartsWith("\\u", StringComparison.InvariantCulture) &&
            s.Length == 6)
        {

            var hex = s.Substring(2);

            if (int.TryParse(hex,
                             NumberStyles.AllowHexSpecifier,
                             CultureInfo.InvariantCulture,
                             out var i))
            {
                c = (char)i;
                return true;
            }
        }
    }

    c = default(char);
    return false;
}

【讨论】:

  • 可以简化为:((char)(int.Parse(_String.Replace(@"\u", ""), NumberStyles.AllowHexSpecifier))).ToString(); Unicode 字符可以用长于 4 位(有效为 8)的十六进制数字表示。
  • @Jimi 没有简化任何东西,它具有完全不同的语义;它只会对有效的转义序列正常工作,并在任何其他情况下爆炸或给出无意义的结果。
  • “荒谬”是什么意思? _String 可以是任何十六进制,以字符串表示,介于 1 和 FFFFFFFE 之间,是否转义。返回相应的 Unicode 符号。当然,并非所有值都可以转换为可表示的字符串,因此需要进行一些错误处理。但这不是重点。我是说只有在转义且长度 = 6 时才解析字符串。因此,如果输入字符串是“\u41”(=“A”)而不是“\u0041”,则不会被解析。此外,不会解析 FFFF 以上的(有效)值。只是变得烦人,在 VS 2013 中,此方法无法编译(我未声明)。
  • @jimi 你没抓住重点。他试图解析编译器理解的转义序列。 `/u41' 是编译时错误。 C#中没有这样的有效转义序列
  • 当然不是,但是 "\u41" 是有效的并且你没有评估它,因为没有评估 FFFF 以上的十六进制值。如果你认为我是在说“我的比你的好”,那么事实并非如此。我注意到你的代码中有一个“缺陷”,我想让你知道。我发布的代码旨在解释这一点,而不是作为“替代”或更好的方式。
猜你喜欢
  • 2013-12-29
  • 1970-01-01
  • 2015-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-27
相关资源
最近更新 更多