我想学习SCSU http://unicode.org/reports/tr6 但是当我尝试Java sample code时,输出总是大于输入。 这就是我得到的: 我试过这个例子:
Öl fließt
他们说输入:
Unicode code points (9 code points):
00D6 006C 0020 0066 006C 0069 0065 00DF 0074
,输出为:
Compressed (9 bytes):
D6 6C 20 66 6C 69 65 DF 74
但我得到的是: 输入:
famihug@hvn:/home/famihug/TestRoom/SCSU%xxd german.txt [0]
0000000: c396 6c20 666c 6965 c39f 7420 0a ..l flie..t .
输出:
famihug@hvn:/home/famihug/TestRoom/SCSU%java CompressMain /compress german.txt
Compressed german.txt: 6 chars to german.csu 13 bytes. Ratio: 108%.
famihug@hvn:/home/famihug/TestRoom/SCSU%ls -lt german.* [0]
-rw-r--r-- 1 famihug famihug 13 2012-06-09 10:24 german.csu
-rw-r--r-- 1 famihug famihug 13 2012-06-08 01:04 german.txt
famihug@hvn:/home/famihug/TestRoom/SCSU%xxd german.csu [0]
0000000: 0fc3 966c 2066 6c69 65c3 9f74 20
~~~~~~~~~~~~~ 这是我尝试日本样本的时候:
famihug@hvn:/home/famihug/TestRoom/SCSU%wc -m jav.txt [0]
117 jav.txt
famihug@hvn:/home/famihug/TestRoom/SCSU%ls -lt jav.* [0]
-rw-r--r-- 1 famihug famihug 349 2012-06-08 01:13 jav.txt
-rw-r--r-- 1 famihug famihug 405 2012-06-08 01:01 jav.csu
他们说输出是压缩的(178字节)
我使用gedit / Vim将样本明文粘贴到文件中。我在这里做错了什么?
答案 0 :(得分:2)
看起来样本编码器需要UTF-16输入,并且你给它UTF-8。
此输入:c396 6c20 666c 6965 c39f 7420 0a
为Öl fließt
,为UTF-8,带有尾随空格和换行符。
你得到的是0fc3 966c 2066 6c69 65c3 9f74 20
。第一个0f
是SCU
标记,表示其余字节是big-endian UTF-16。问题是,而不是输入字符串的UTF-16等价物,其余的字节只是来自输入的完全相同的字节(减去换行符),而那些相同的字节代表完全不同UTF-8和UTF-16之间的字符。
您回来的输出似乎代表쎖氠晬楥쎟琠
。请注意,这是一个6个字符长的字符串,报告为CompressMain
。您可以通过同一类的/expand
运行压缩输出以进行确认。
如果您使用UTF-16编码输入文件,而不是UTF-8,则应该得到您期望的输出。