无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 2584|回复: 9
打印 上一主题 下一主题

[求助] 求教一个对齐的问题?

[复制链接]
跳转到指定楼层
1#
发表于 2013-6-5 09:28:29 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本来的之前有问过这个问题:http://bbs.wuyou.net/forum.php?mod=viewthread&tid=308611

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

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

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

点评

汉字utf8编码的话确实是会占据3个字节 但显示会占用2个字符  详情 回复 发表于 2013-6-5 11:04
回复

使用道具 举报

3#
发表于 2013-6-5 11:04:26 | 只看该作者
zhaohj 发表于 2013-6-5 10:31
如 set var1=abcdABCD中国龙ABCDabcd
先获取变量值的长度(字节数),set var1=%var1% && set /a len1=*0x ...

汉字utf8编码的话确实是会占据3个字节 但显示会占用2个字符
回复

使用道具 举报

4#
发表于 2013-6-5 11:10:44 | 只看该作者
你可以参考下我在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值是汉字个数
回复

使用道具 举报

5#
 楼主| 发表于 2013-6-5 12:13:00 | 只看该作者
恩,谢谢!谢谢sratlf  、 zhaohj
回复

使用道具 举报

6#
发表于 2013-6-6 09:53:41 | 只看该作者
本帖最后由 不点 于 2013-6-6 10:35 编辑

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

更正:

对不起。grub4dos 的 Unicode 支持,仅支持 Unicode 代码点 0 至 FFFF,共 65536 个字符。这个范围的 Unicode 字符用 UTF8 编码格式,最多确实只需要三个字节。两个字节的编码不是汉字,汉字至少需要三个字节。因此,在 grub4dos 中,汉字确实恰好是占用 3 字节的 UTF8 编码。
回复

使用道具 举报

7#
发表于 2013-6-6 16:51:23 | 只看该作者
本帖最后由 zhaohj 于 2013-6-6 16:55 编辑

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

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

Snap0.jpg

点评

就是utf8的编码规则 http://blog.csdn.net/sandyen/article/details/1108168 http://blog.csdn.net/winner82/article/details/2069717 http://hi.baidu.com/autowomen/item/7f664cefcc3896394ddcafa4  详情 回复 发表于 2013-6-6 22:54
回复

使用道具 举报

8#
发表于 2013-6-6 17:01:35 | 只看该作者
另外,cat命令显示的右边部分,能显示中文吗?
回复

使用道具 举报

9#
发表于 2013-6-6 18:52:03 | 只看该作者
可以显示中文,但禁止了。因为中文占据 3 个字节,容易被拆开,造成乱码。

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

回复

使用道具 举报

10#
发表于 2013-6-6 22:54:59 | 只看该作者
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。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2024-12-5 09:46

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表