如何使用ASCII数据分配一个字符?

6

如何将ASCII字符存储到“char”字面值中?

我想要用于特殊字符的ASCII字符是文件分隔符号:

十进制:028
八进制:034
十六进制:01C
二进制:00011100

// This works in C/C++, but not C#:
static const char FS = 0x1C; // File Separator

1
注意:没有非托管的C#。 - ChaosPandion
混沌:是的,有的:http://msdn.microsoft.com/zh-cn/library/aa288474(VS.71).aspx - Noon Silk
2
仍然是受控的。你可以做不安全的事情。 - ChaosPandion
@Chaos:那只是我知道的最好的解释方式。不知道它只是一个简单的转换,我一直在想是否有什么奇怪的方法可以让它工作(比如'char FS = Convert.ToChar(char.GetType(funky-funk#8));'),而不必调用“不安全”的块。除了“托管”,还有更好的词来描述我想要的吗? - user153923
不,你的问题只是涉及C++和C#之间的语法差异。 - ChaosPandion
4个回答

14

静态修饰符不是必需的,您需要显式地将int强制转换为char。

const char FS = (char)0x1C;

谢谢。我想这么简单,我甚至没想到要进行转换。 - user153923

5
我想 '\u001C' 可以使用。

今天我把这个改成了我的答案,因为我发现这是我实际使用的版本。谢谢Marc。顺便说一句:喜欢你的节日头像。我似乎无法更改我的Gravatar。过去每次尝试都会使我的头像恢复到SO分配的通用头像。 - user153923

2

常量字符FS的值为'\x1C'。


4
\x 转义序列在字符串中很不友好,可以说是纯恶魔。例如,"\x9Bad Compiler" 和 "\x9Good compiler" 之间的区别相当难以察觉。对于单个字符来说可能还好,但我猜我自己会使用 \u001c - Jon Skeet
ChaosPandion 先得到了它。我曾尝试使用 '\1C',但那没用。谢谢! - user153923
@Jon Skeet:但是你可以像使用\u一样轻松地使用四个数字的\x。例如,"\x0009Bad Compiler"将编译为与"\u0009Bad Compiler"相同。对于char字面量,\x更方便,因为您不必使用所有四个数字。如果不小心处理字符串,则可能会出现问题,正如您所指出的那样。但是,如果没有歧义(例如在序列后面没有字母数字),那么我仍然更喜欢\x。顺便说一句,我强烈反对使用“邪恶”这个词来表示“棘手或危险的结构”。 - P Daddy
2
所以我很邪恶。我闯红灯,我双倍享用,我使用\x。嘿嘿嘿!!!说真的,一旦你撞了几次南墙,你就再也不会犯同样的错误了。考虑到调试这种问题的乐趣,大脑将会有一个专门的叶叶来处理它。 - Seva Alekseyev

0

如果您要将此内容写入流,请注意编码问题;.NET的字符和字符串是UTF-16编码的,因此实际上会被写成001C(或1C00,具体取决于字节序;我不记得了)。您可以在打开流时指定适当的编码来避免这个问题。

编辑:实际上,情况并非如此!经过测试,StreamWriter等的默认行为是使用系统当前的ANSI代码页(通常是ISO-8859-1),因此它实际上以预期的8位格式写入。这当然会给非ANSI字符带来意外的结果。


@审问者:Jon Skeet和Marc Gravell建议使用'\u001C'可以防止UTF-16流的滑动吗? - user153923
@jp2code:我实际上错了,不要在意 :) 但是,无论如何分配字符的方式都不会影响它被写入流的方式。 - Will Vousden

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接