Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Ruby 1.9.3为什么\x03";。强制“U编码”(UTF-8)获取\u0003,但\x03";。强制“U编码”(UTF-16)获取\x03";_Ruby On Rails_Ruby_Encoding_Utf 8_Utf 16 - Fatal编程技术网

Ruby on rails Ruby 1.9.3为什么\x03";。强制“U编码”(UTF-8)获取\u0003,但\x03";。强制“U编码”(UTF-16)获取\x03";

Ruby on rails Ruby 1.9.3为什么\x03";。强制“U编码”(UTF-8)获取\u0003,但\x03";。强制“U编码”(UTF-16)获取\x03";,ruby-on-rails,ruby,encoding,utf-8,utf-16,Ruby On Rails,Ruby,Encoding,Utf 8,Utf 16,Ruby 1.9.3 irb(main):036:0* "\x03".force_encoding("UTF-16") => "\x03" irb(main):040:0* "\x03".force_encoding("UTF-8") => "\u0003" 为什么“\x03”.强制编码(“UTF-8”)是\u0003而“\x03”.强制编码(“UTF-16”)以“\x03”结尾,我想应该是相反的 因为“\x03”不是UTF-16中的有效代码点,而是UTF-8中的有效代码点(ASC

Ruby 1.9.3

irb(main):036:0* "\x03".force_encoding("UTF-16")
=> "\x03"
irb(main):040:0* "\x03".force_encoding("UTF-8")
=> "\u0003"
为什么“\x03”.强制编码(“UTF-8”)是\u0003而“\x03”.强制编码(“UTF-16”)以“\x03”结尾,我想应该是相反的

因为
“\x03”
不是UTF-16中的有效代码点,而是UTF-8中的有效代码点(ASCII 03,ETX,文本结尾)。必须至少使用两个字节来表示UTF-16中的unicode代码点

这就是为什么在UTF-8中可以将
“\x03”
视为unicode
\u0003
,而在UTF-16中则不能

要在UTF-16中表示
“\u0003”
,必须根据字节顺序使用两个字节,即
00 03
03 00
。这就是为什么我们需要在UTF-16中指定字节顺序。对于big-endian版本,字节序列应为

FE FF 00 03
FF FE 03 00
对于little endian,字节序列应为

FE FF 00 03
FF FE 03 00
字节顺序标记应出现在字符串的开头或文件的开头

从Ruby 1.9开始,String只是一个字节序列,带有一个特定的编码作为标记
force_encoding
是一种更改编码标记的方法,它不会影响字节序列。您可以通过检查
“\x03”.force\u编码(“UTF-8”).bytes
来验证这一点

如果您看到
“\u0003”
,这并不意味着您得到了一个以两个字节表示的字符串
00 03
,而是一些字节表示该字符串中所携带的特定编码下的Unicode码点
0003
。它可能是:

03              //tagged as UTF-8
FE FF 00 03     //tagged as UTF-16
FF FE 03 00     //tagged as UTF-16
03              //tagged as GBK
03              //tagged as ASCII
00 00 FE FF 00 00 00 03 // tagged as UTF-32
FF FE 00 00 03 00 00 00 // tagged as UTF-32

请不要只是否决我,如果我做了错误的假设,请告诉我。谢谢。
“\x03”。强制编码('binary')。编码('utf-16')
可能更具启发性
force_编码
允许您生成无效编码的文本,例如
\x03
假装为UTF-16或
“\xce”。force_编码('UTF-8')
假装为UTF-8。我的UTF-16知识非常贫乏,所以只需一句评论。你能解释一下为什么我不能用[993].pack(“n”)来表示“\x81”,但我可以用“\x81”和“\x03\xE1”来表示,当[993].pack(“n”)是“\x03\xE1”。如果“\x03”在UTF-16中无效,为什么强制它为UTF-16,你会得到“\x03”而不是“\u0003”?在案例2中,显然\x03是一个字节的东西,强迫它是utf-8,我最终得到了一个2字节的东西???我还是不明白。@tensaix2j从Ruby 1.9开始,字符串只是一个字节序列,带有一个特定的编码作为标记
force_encoding
是一种更改编码标记的方法,它不会影响字节序列。您可以通过检查
“\x03”.force_编码(“UTF-8”).bytes
“\x81”+[993].pack(“n”)编码::CompatibilityError:不兼容的字符编码:IBM437和ASCII-8BIT from(irb):70 from c:/ruby/2.0.0/bin/irb:12:in
”irb(main):071:0>[993]。pack(“n”)=>“\x03\xE1”irb(main):072:0>irb(main):073:0*“\x81”+“\x03\xE1”=>“\x81\x03\xE1”irb(main):074:0>“\x81”+[993]。pack(“n”).b Encoding::CompatibilityError:不兼容字符编码:IBM437和ASCII-8BIT from(irb):74 from c:/ruby/2.0.0/bin/irb:12:in
”@tensaix2j错误消息已经告诉您。在您的计算机中,
“\x81”
是带有编码标签的
[129]
,而
[993]。pack(“n”)
为您提供带有编码标签的
[3225]
。当底层编码标记相同时,只能合并两个字符串。在这种情况下,您可以执行
“\x81”。强制_编码(“ASCII-8BIT”)+[993]。打包(“n”)