无忧启动论坛

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

[已解决] 怎样用最简便的方法把八千余汉字utf8字节数列举出来?

  [复制链接]
跳转到指定楼层
1#
发表于 2017-8-31 18:29:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 gnuxwy 于 2017-9-12 23:48 编辑

屮从网上查知,汉字在utf8编码体系中字节数氏可变的。
最短的氏两字节,就氏〇一二三四五中的〇字了。
<注:仔细核对下,屮的系统中〇字氏三字节的,或许以前的unicode版本中氏两字节。>
<或者,可能有两个 〇 符号,一个两字节的,一个氏三字节的。>
而其余的汉字,有的氏三字节,有的氏四字节。

屮最近在制做通规8ki汉字码表,很想知道这八千通规字中:
到底有多少三字节汉字,氏哪些字?有多少四字节汉字,又氏哪些字?

所以这样的话,屮想请各位坛友有什么简便方法,可以把这个列表搞出来。通规汉字8kiz文件在附件中。
用脚本也可以,用命令也可以,用小程序也可以;如果都没有现成的兵程序,有简短源码,屮自已编译也行。

谢谢帮助!

竟然不支持7z的后缀名上传文件,真氏奇怪。


GNHZ8kiz.zip

16.13 KB, 下载次数: 7, 下载积分: 无忧币 -2

2#
发表于 2017-8-31 19:13:05 | 只看该作者
屮、氏
之类个性用字让人看着吃力。
窃以为在交流中让人看得轻松流畅更和谐。

点评

多谢大哥的意见,不过语言、文字本身就氏相对变化的。屮喜欢用简单的字。  详情 回复 发表于 2017-9-1 02:17
回复

使用道具 举报

3#
发表于 2017-8-31 20:05:06 | 只看该作者
PECMD写的小程序。
GNHZ8kiz.zip (977.26 KB, 下载次数: 10)

代码:
ENVI^ ForceLOcal=1
//LOGS X.LOG
SET SRC=GNHZ8kiz
SET$ NL=0d 0a
SET S3=
SET S4=
READ %SRC%,*r,&V
FORX *NL &V,&vi,
{*
    CODE **-UNI,&Vi,**-UTF8,&V8
    STRL -bin &n=&V8
    IFEX #%n%=3, SET S3=%S3%%NL%%Vi%! IFEX #%n%=4, SET S4=%S4%%NL%%Vi%
}
MSTR * S3=3,0,S3
MSTR * S4=3,0,S4
PUTF -dd -len=0 3C.TXT,0,zero
WRIT-UTF8 3C.TXT,$0,%S3%
PUTF -dd -len=0 4C.TXT,0,zero
WRIT-UTF8 4C.TXT,$0,%S4%
MESS. 完毕
回复

使用道具 举报

4#
发表于 2017-8-31 20:55:00 | 只看该作者
http://utf8.supfree.net

这个算不?
回复

使用道具 举报

5#
 楼主| 发表于 2017-9-1 02:17:36 | 只看该作者
pseudo 发表于 2017-8-31 19:13
屮、氏
之类个性用字让人看着吃力。
窃以为在交流中让人看得轻松流畅更和谐。

多谢大哥的意见,不过语言、文字本身就氏相对变化的。屮喜欢用简单的字。
回复

使用道具 举报

6#
 楼主| 发表于 2017-9-1 02:27:45 | 只看该作者
多谢mdyblog大哥的小程序,帮屮把通规汉字的3字节和4字节都分出来了。
不过pecmd的源码没接触过,c和cpp或氏bash的话还能看懂一点点的。
看那些变量设置和使用,和bash也有些类似。
非常感谢,这样搞清楚了,原来通规汉字中只有196个4字节汉字。


楼上的nttwqz坛友给的网址屮也试过了,只氏转成unicode数字代号,不氏utf8的汉字多字节码。
仍然多谢您的关注和指引,只氏和需求不一致。

点评

PECMD强大,但是语法和变量太晦涩了。 给你个ruby脚本byte_chars.rb: 重点代码只是第六行一句而已。  详情 回复 发表于 2017-9-21 13:30
回复

使用道具 举报

7#
发表于 2017-9-21 13:30:03 | 只看该作者
本帖最后由 slore 于 2017-9-22 15:04 编辑
gnuxwy 发表于 2017-9-1 02:27
多谢mdyblog大哥的小程序,帮屮把通规汉字的3字节和4字节都分出来了。
不过pecmd的源码没接触过,c和cpp或 ...


PECMD强大,但是语法和变量太晦涩了。

  1. 3字节汉字有7929个
  2. 4字节汉字有196个
  3. 3chars.txt
  4. 一 0xE4B880
  5. 乙 0xE4B999
  6. 二 0xE4BA8C
  7. ...

  8. 4chars.txt
  9. &#180860; 0xF0AC89BC
  10. &#134352; 0xF0A0B390
  11. &#155351; 0xF0A5BB97
  12. ...
复制代码


给你个ruby脚本byte_chars.rb:

简单版,不要16进制数的话,10行。思路就是打开文件1行一个字,判断是几个字节,写到对应的Nchars.txt文件。
  1. # coding: UTF-8
  2. # GNHZ8kiz 要另存为 UTF-8 without BOM,否则第一行算6字节字了
  3. f = []
  4. f[0] = File.open("3chars.txt", 'w+')
  5. f[1] = File.open("4chars.txt", 'w+')

  6. def hexcode(c)
  7.   c.bytes.map {|b| b.to_s(16).upcase}.join('') #每个字节转成16进制数字并拼接起来
  8. end

  9. File.open('GNHZ8kiz').each_line do |c|
  10.   c.chomp! #移除换行符
  11.   f[c.bytes.size-3].write "#{c} 0x#{hexcode(c)}\n"
  12. end
复制代码


完整版:
  1. # coding: UTF-8

  2. $chars = [[],[],[],[],[]]
  3. File.open('GNHZ8kiz').each_line do |c|
  4.   c.chomp! #移除换行符
  5.   $chars[c.bytes.size-1].push c
  6. end

  7. $chars.each_with_index do |group, i|
  8.   puts "#{i+1}字节汉字有#{group.size}个" if group.size > 0
  9. end

  10. def output(i)
  11.   f = File.open("#{i}chars.txt", 'w+')
  12.   $chars[i-1].each do |c|
  13.     h = '';c.bytes.each {|b| h<<b.to_s(16).upcase}
  14.     f.write "#{c} 0x#{h}\n"
  15.   end
  16.   f.close
  17. end

  18. output(3)
  19. output(4)
复制代码


重点代码只是第12行。
回复

使用道具 举报

8#
 楼主| 发表于 2017-9-24 23:46:35 | 只看该作者
多谢楼上slore坛友的ruby脚本。。。
嗯,确实ruby的脚本比pecmd的脚本可读性要好些,更接近c和cjj的语法。
回复

使用道具 举报

9#
发表于 2023-1-2 00:34:25 | 只看该作者
感谢分享
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2025-12-11 03:49

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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