【发布时间】:2017-09-24 17:04:31
【问题描述】:
我知道\u{...} 可用于指定十六进制的 unicode 代码点。
但是,"\x86" != "\u{86}"。但是,"\x7F" == "\u{7F}"。
\x 和 \u 转义序列有什么区别?
【问题讨论】:
标签: crystal-lang unicode-escapes
我知道\u{...} 可用于指定十六进制的 unicode 代码点。
但是,"\x86" != "\u{86}"。但是,"\x7F" == "\u{7F}"。
\x 和 \u 转义序列有什么区别?
【问题讨论】:
标签: crystal-lang unicode-escapes
"\xNN" 似乎可以处理十六进制格式的 ASCII 代码。 "\uNNNN" 和 "\u{NN}" 以十六进制格式处理 Unicode 代码点。
ASCII 在十进制格式(HEX:7F)中只能达到 127,所以这可以解释为什么代码点 126(HEX:7E,“~”字符)有效,但 128(HEX:80)及以上(HEX: 85、86 等)不能使用 \xNN 转义序列。
您可以使用 String#codepoints 方法查看“下方”发生的情况。
puts "\x7F".inspect # "~"
puts "\x7F".codepoints # [126]
# =====================================
puts "\x80".inspect # "\x80" (Invalid ASCII codepoint.)
puts "\x80".codepoints # [65533]
# =====================================
puts "\u{80}".inspect # "\u0080" (Valid Unicode codepoint.)
puts "\u{80}".codepoints # [128]
Crystal 用 65533 替换无效的代码点,替换字符基本上表示“此编码无效”。
【讨论】: