C# Char.IsControl方法无法将某些字符识别为控件

C# Char.IsControl方法无法将某些字符识别为控件,c#,C#,我注意到C#'Char.IsControl'方法无法将某些字符识别为控件。例如,以下代码对两个值都输出false: char pilcrow = '\u00B6'; char softHyphen = '\u00AD'; Console.Write("{0},{1}",char.IsControl(pilcrow), char.IsControl(softHyphen)); // -> 'false,false' 这是预期的行为吗?我需要在代码中转义这些字符。这些不是控制字符。一个是属于

我注意到C#'Char.IsControl'方法无法将某些字符识别为控件。例如,以下代码对两个值都输出false:

char pilcrow = '\u00B6';
char softHyphen = '\u00AD';
Console.Write("{0},{1}",char.IsControl(pilcrow), char.IsControl(softHyphen)); // -> 'false,false'

这是预期的行为吗?我需要在代码中转义这些字符。

这些不是控制字符。一个是属于
标点符号的¨,另一个是[Po]
类别,另一个是软连字符,一种不可见的格式字符,影响文本的连字符方式

它们没有什么特别之处,事实上,您可能在用Word编写段落时使用软连字符,并希望控制某些单词的连字符。Word使用¨作为段落标记-段落结尾的可视化。它不影响格式,只是表示段落结尾的常用方式。在这方面,它与²、³、§、¨、¨、°、½、¨(只需按住正确的Alt键并敲击键)没有什么不同

.NET字符串使用Unicode,因此无需转义这些字符。你可以直接打出来

打印也没有问题——毕竟这些字符用于文档处理。软连字符控制UI或打印引擎在渲染到屏幕或纸张时如何布局文本


如果有人不想打印这些字符,只需一个简单的
字符串.Remove即可。重新移动连字符会影响文本的打印方式,长单词会移到下一行。在上一句中,我将连字符添加到
删除
,以强制使用连字符。如果没有它,
删除
将移动到下一行

我99.9999%确信,如果像这样的函数包含错误,它早就被发现了。From:“Unicode标准将代码点从\U0000分配到\U001F、\U007F,从\U0080分配到\U009F以控制字符”<代码>\u00B6
\u00AD
不在此范围内。这些不是控制字符。一个是¨另一个是,不可见字符Unicode将
\00B6
视为“其他标点符号”,将
\u00AD
视为“格式”。请参见As以了解我的代码中是否需要转义此类字符
为什么。NET字符串是Unicode。你不需要逃避任何事情,这个问题就是证明——ASP.NET应用程序也是如此,它将数据存储在
nvarchar
(Unicode)列中。这就是为什么像这样的角色可以不经过任何特殊处理就发布。你会发现很多关于中文或日文文本的问题,这些问题不需要SO开发者的特殊处理。海报只是在问题中张贴了他们的文字