C# 字符串字符0x85(省略号?

本文关键字:省略号 0x85 字符串 字符 | 更新日期: 2023-09-27 17:57:00

我的C#程序接收字符串数据(通过Windows消息队列),有时在字符串中包含char-133。

这在 c# 中是有效的值吗?

例如,如果我这样做:

string x = "a" + (char)133 + "b"; // 133 = 0x85

我可以看到字符串x的长度为3,但在Visual Studio调试器中,我只能看到x = "ab"。

如果我执行以下操作,我会得到"省略号"字符(我认为 133 也应该来自提供它的程序):

string y = "a" + (char)8230 + "b"; // 8230 = 0x2026

感谢您的任何指示。

C# 字符串字符0x85(省略号?

string中,char没有"无效"值。有"无效的 Unicode 代码点",但string可以毫无问题地包含它们,因为string是一个"愚蠢的容器"(但请注意,一些string方法"更智能",不喜欢太多无效的代码点......通常他们会跳过它们/用一些替换字符替换它们)

现在。。。"可视化工具"(必须"显示"字符串的模块/函数/方法)通常有限制,无法显示所有字符(即使是完全有效的字符)......一个经典的例子是Zalgo和Zalgo。这是你的问题,但这是另一个问题:-)

举个例子,在Windows中至少有4个"官方"API可以将文本写入屏幕:GDI,GDI+,Uniscribe,DirectWrite。许多程序(主要是游戏)然后使用 FreeType 库作为替代方案......这些库中的每一个都与 Unicode 的某些部分兼容。

我要补充一点,给你(0x85)带来麻烦的角色叫做NEL或Next Line。它是一个控制字符,所以不应该被"显示",它有一个复杂而有趣的故事,这可以解释为什么它有时显示为省略号:

NEL 的代码在 Windows-1252 中用作省略号 ('...') 字符。

例如:

  • YAML[8] 不再将它们识别为特殊,以便与 JSON 兼容。

  • ECMAScript[9] 接受 LS 和 PS 作为换行符,但认为 U+0085 (NEL) 是空格,而不是换行符。

  • Microsoft Windows 2000 不会在默认文本编辑器记事本中将任何 NEL、LS 或 PS 视为换行

在Linux上,一个流行的编辑器gedit将LS和PS视为换行符,但不适用于NEL。