无忧启动论坛

标题: 求教一个对齐的问题? [打印本页]

作者: zbkh    时间: 2013-6-5 09:28
标题: 求教一个对齐的问题?
本来的之前有问过这个问题:http://bbs.wuyou.net/forum.php?mod=viewthread&tid=308611

在这里再次感谢chenall 、sratlf 、zhaohj

对于字符,利用上面的方法已经能够很好的解决对齐问题,但是遇到有字符以及汉字,对齐就不知道该如何实现,一个字符值的长度为1,一个汉字值的长度为3,但显示一个汉字比显示3个字符所占用屏幕面积要少!

求怎么样才能解决汉字与字符同时都有的对齐问题?
作者: zhaohj    时间: 2013-6-5 10:31
如 set var1=abcdABCD中国龙ABCDabcd
先获取变量值的长度(字节数),set var1=%var1% && set /a len1=*0x4cb00
------------------
另你理解有误,一个汉字占2个字节(内存中),不要与字符编码占字节数相混淆。
作者: sratlf    时间: 2013-6-5 11:04
zhaohj 发表于 2013-6-5 10:31
如 set var1=abcdABCD中国龙ABCDabcd
先获取变量值的长度(字节数),set var1=%var1% && set /a len1=*0x ...

汉字utf8编码的话确实是会占据3个字节 但显示会占用2个字符
作者: sratlf    时间: 2013-6-5 11:10
你可以参考下我在RUN里的处理  有涉及到中文对齐的问题  包括计算显示长度以及截取指定显示长度

比如获取变量tmp值的显示长度可以用下面这段
  1. :str_length
  2. set n=
  3. set utf8n=
  4. call Fn.12 "%tmp%" || exit
  5. set n=%@retval% && set utf8n=0
  6. echo -e -n %tmp% > (md)0x200+1
  7. cat --hex (md)0x200+1 > (md)0x201+4
  8. cat --skip=9 --locate=\x20E (md)0x201+4 > nul || exit
  9. set /a n=%n% - %@retval% > nul && set utf8n=%@retval%
  10. exit
复制代码
执行完毕后n值是显示长度  utf8n值是汉字个数
作者: zbkh    时间: 2013-6-5 12:13
恩,谢谢!谢谢sratlf  、 zhaohj
作者: 不点    时间: 2013-6-6 09:53
本帖最后由 不点 于 2013-6-6 10:35 编辑

UTF8 编码格式的汉字,有可能占据 3 个字节、4 个字节、5 个字节、6 个字节。常用的汉字可能是占用 3 个字节。但占用 4 个字节的,也有很多。如果你认为汉字一定只占用 3 个字节,恐怕你将来会遇到某些麻烦。

更正:

对不起。grub4dos 的 Unicode 支持,仅支持 Unicode 代码点 0 至 FFFF,共 65536 个字符。这个范围的 Unicode 字符用 UTF8 编码格式,最多确实只需要三个字节。两个字节的编码不是汉字,汉字至少需要三个字节。因此,在 grub4dos 中,汉字确实恰好是占用 3 字节的 UTF8 编码。
作者: zhaohj    时间: 2013-6-6 16:51
本帖最后由 zhaohj 于 2013-6-6 16:55 编辑

确实,汉字恰好是占用3字节的UTF8编码,有趣的是汉字第一个字节的编码都是E开头,sratlf是怎么发现的?

Snap0.jpg (56.13 KB, 下载次数: 64)

Snap0.jpg

作者: zhaohj    时间: 2013-6-6 17:01
另外,cat命令显示的右边部分,能显示中文吗?
作者: 不点    时间: 2013-6-6 18:52
可以显示中文,但禁止了。因为中文占据 3 个字节,容易被拆开,造成乱码。

可以打个补丁,显示 UTF8中文字符,不过意义不大。


作者: sratlf    时间: 2013-6-6 22:54
zhaohj 发表于 2013-6-6 16:51
确实,汉字恰好是占用3字节的UTF8编码,有趣的是汉字第一个字节的编码都是E开头,sratlf是怎么发现的?

就是utf8的编码规则  
http://blog.csdn.net/sandyen/article/details/1108168
http://blog.csdn.net/winner82/article/details/2069717
http://hi.baidu.com/autowomen/item/7f664cefcc3896394ddcafa4

UTF-8是一种变长字节编码方式。对于某一个字符的UTF-8编码,如果只有一个字节则其最高二进制位为0;如果是多字节,其第一个字节从最高位开始,连续的二进制位值为1的个数决定了其编码的位数,其余各字节均以10开头。UTF-8最多可用到6个字节。
如表:
1字节 0xxxxxxx
2字节 110xxxxx 10xxxxxx
3字节 1110xxxx 10xxxxxx 10xxxxxx
4字节 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
5字节 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
6字节 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
UTF-8就是以8位为单元对UCS进行编码。从UCS-2到UTF-8的编码方式如下:

UCS-2编码(16进制) UTF-8 字节流(二进制)
0000 - 007F 0xxxxxxx
0080 - 07FF 110xxxxx 10xxxxxx
0800 - FFFF 1110xxxx 10xxxxxx 10xxxxxx

例如“汉”字的Unicode编码是6C49。6C49在0800-FFFF之间,所以肯定要用3字节模板了:1110xxxx
10xxxxxx 10xxxxxx。将6C49写成二进制是:0110 110001 001001,
用这个比特流依次代替模板中的x,得到:11100110 10110001 10001001,即E6 B1 89。





欢迎光临 无忧启动论坛 (http://wuyou.net/) Powered by Discuz! X3.3