我在字符串中嵌入ASCII控制字符,由于某种原因,它们被剥离了。
示例:
"a\x03b"[1]
// 59 ';'
"a\x03b".Length
// 2
另一方面:
"a\x03mb"[1]
// 3 ''
"a\x03mb".Length
// 4
("a" + '\x03' + "b")[1]
// 3 ''
("a" + '\x03' + "b").Length
// 3
答案 0 :(得分:5)
此:
"a\x03b"
是这个字符串:
"ax"
^
+- the single character with the unicode code point \x03b
另一方面,这个:
"a\x03mb"
是这个字符串:
"axmb"
^
+- the single character with the unicode code point \x03
在字符串中嵌入转义的unicode代码点时,请确保不能将以下字符理解为指定要编码的字符的十六进制值的一部分。
\x03b <-- b is a valid hexadecimal character
\x03mb <-- m is not, however, so the escaped character is just \x03
documentation for specifying character literals有这样说:
表示第2,第3和第4个十六进制数字是可选。但是,编译器无法理解这个"\x03b"
应该是两个字符,'\x03'
和'b'
,并且您并不真正意味着"\x03b"
是单个字符字符'\0x3b'
。
基本上,如果第2,第3和第4个字符是十六进制字符(0-9,A-F),则假定它们是转义代码点的一部分。
有没有办法确保'\x03'
后跟'b'
?当然,只需在转义的代码点前面填充足够的零位数,就可以得到4个十六进制字符:
+- the letter b
|
"\x0003b"
^-+--^
|
+-- the single unicode code point \x0003 (or \x3, \x03, \x003)
答案 1 :(得分:1)
根据hex-literals的C#规范,第一个之后的所有字符都是可选的。因此,尾随b
被解释为十六进制文字的一部分。
\x03 == \x0003
\x003 == \x0003
\x0003 == \x0003
\x03b == \x003b
由于m
不是有效的十六进制字符,因此不会对其进行解析。
指定完整的4个字符的文字以避免此问题。
"a\x0003b".Length == 3