打印

记得有那种分析C代码中的字符串,找出汉字列表

[复制链接]
8221|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
mcuisp|  楼主 | 2011-6-9 23:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
mohanwei| | 2011-6-10 00:14 | 只看该作者
自己编吧,路子:
首先必须保证工程已经编译通过,无错误。
1-遍历指定目录,读取所有指定类型文件(cpp,c,h等),合并成一个临时文件;
2-删除所有注释,包括C/C++风格
3-提取所有字符串(被""括起来的那些)到临时缓冲区
4-排序,删除重复,得到汉字索引;
5-将索引逐个取模,格式化成字库,字库结构:
typedef struct
{
    u16 Hz;
    u8 Dot[16*2];//16x16点阵
}HZ_Struct;
显示时可以直接遍历点阵(速度慢);
也可以根据汉字内码,在索引数组里用逐次逼近法查找字库偏移量,再读取点阵(平均速度快,还可以把结构体里的u16 Hz干掉)

使用特权

评论回复
板凳
lxyppc| | 2011-6-10 08:31 | 只看该作者
本帖最后由 lxyppc 于 2011-6-10 08:40 编辑

楼主我以前做了个这么个工具,因为一个工程为要用到汉字,但是又不多,只有几十个。

但是有几个要求必须满足
1. 汉字只能在同一个文件中
2. 出现的不同汉字个数不能大于128。
源代码在google code上
http://code.google.com/p/lxyppc-codepaint
是我签名档工具的一个衍生工程

如果要改成楼主需求可以网上找一下,找不到的话可以在这个工具基础上加一个前端工具,找出所有文件中的字符串,合在一起,输出到一个文件中。
原文件中汉字的编码需不需要根据最小索引改变?要的话就比较麻烦了,最后还要回到原文件中去将汉字改成新的索引

输入是这样的格式

const LPCSTR StringTable_CHS[STR_LAST] ={        
  [STR_CAMERA_ON]       = "摄像头开",
  [STR_CAMERA_OFF]      = "摄像头关",
  [STR_JOYSTICK]        = "游戏手柄",
  [STR_MOUSE]           = "鼠标",
  [STR_AIR_MOUSE]       = "感应鼠标",
  [STR_KEYBOARD]        = "键盘",
  [STR_KB_NORMAL]       = "正常",
  [STR_KB_SEQ]          = "顺序",
  [STR_TETRIS]          = "俄罗斯方块",
  [STR_TETRIS_PAUSE]    = "游戏暂停    ",
  [STR_TETRIS_OVER]     = "游戏结束    ",
  [STR_TETRIS_PLAY]     = "游戏进行中..",
  [STR_TETRIS_SWITCH]   = "请先暂停游戏!",
  [STR_ABOUT_0]         = "超级手柄 1.0",
  [STR_ABOUT_1]         = "lxyppc@163.com",
  [STR_ABOUT_2]         = "版权所有",
  [STR_MOUSE_0]         = "R1 - 滚轮向上",
  [STR_MOUSE_1]         = "R2 - 滚轮向下",
  [STR_MOUSE_2]         = "按键:",
  [STR_MOUSE_3]         = "4左  3中  2右",
  [STR_SETTING]         = "设置",
  [STR_LANG_CHS]        = "简体中文",
  [STR_LANG_ENG]        = "English",
  [STR_ABOUT]           = "关于"
  [STR_AIR_MOUSE_0]     = "按住1键后旋转",
  [STR_AIR_MOUSE_1]     = "手柄,让球移出",
  [STR_AIR_MOUSE_2]     = "内框,以此控制",
  [STR_AIR_MOUSE_3]     = "鼠标",
};
输出这样的格式

const LPCSTR StringTable_CHS[STR_LAST] ={        
  [STR_CAMERA_ON]       = /*"摄像头开"*/"\x9F\x89\x93\x98",
  [STR_CAMERA_OFF]      = /*"摄像头关"*/"\x9F\x89\x93\x8B",
  [STR_JOYSTICK]        = /*"游戏手柄"*/"\xAD\x9A\x9C\xA8",
  [STR_MOUSE]           = /*"鼠标"*/"\xC2\xA9",
  [STR_AIR_MOUSE]       = /*"感应鼠标"*/"\x99\x97\xC2\xA9",
  [STR_KEYBOARD]        = /*"键盘"*/"\xC0\xB1",
  [STR_KB_NORMAL]       = /*"正常"*/"\xAB\x95",
  [STR_KB_SEQ]          = /*"顺序"*/"\xC1\x96",
  [STR_TETRIS]          = /*"俄罗斯方块"*/"\x87\xB6\xA1\xA2\x92",
  [STR_TETRIS_PAUSE]    = /*"游戏暂停    "*/"\xAD\x9A\xA4\x88    ",
  [STR_TETRIS_OVER]     = /*"游戏结束    "*/"\xAD\x9A\xB5\xA7    ",
  [STR_TETRIS_PLAY]     = /*"游戏进行中.."*/"\xAD\x9A\xBF\xB8\x82..",
  [STR_TETRIS_SWITCH]   = /*"请先暂停游戏!"*/"\xBB\x8A\xA4\x88\xAD\x9A!",
  [STR_ABOUT_0]         = /*"超级手柄 1.0"*/"\xBC\xB4\x9C\xA8 1.0",
  [STR_ABOUT_1]         = "lxyppc@163.com",
  [STR_ABOUT_2]         = /*"版权所有"*/"\xAF\xA6\x9B\xA5",
  [STR_MOUSE_0]         = /*"R1 - 滚轮向上"*/"R1 - \xAE\xBE\x91\x80",
  [STR_MOUSE_1]         = /*"R2 - 滚轮向下"*/"R2 - \xAE\xBE\x91\x81",
  [STR_MOUSE_2]         = /*"按键:"*/"\x9D\xC0:",
  [STR_MOUSE_3]         = /*"4左  3中  2右"*/"4\x94  3\x82  2\x8F",
  [STR_SETTING]         = /*"设置"*/"\xBA\xB7",
  [STR_LANG_CHS]        = /*"简体中文"*/"\xB3\x86\x82\xA0",
  [STR_LANG_ENG]        = "English",
  [STR_ABOUT]           = /*"关于"*/"\x8B\x83",
  [STR_AIR_MOUSE_0]     = /*"按住1键后旋转"*/"\x9D\x85\x31\xC0\x90\xA3\xBD",
  [STR_AIR_MOUSE_1]     = /*"手柄,让球移出"*/"\x9C\xA8,\xB9\xB0\xB2\x8D",
  [STR_AIR_MOUSE_2]     = /*"内框,以此控制"*/"\x8C\xAA,\x84\xAC\x9E\x8E",
  [STR_AIR_MOUSE_3]     = /*"鼠标"*/"\xC2\xA9",
};

/** Replaced strings:
      上下中于以住体俄停像先关内出制右后向块头左常序应开感戏所手按控摄文斯方旋暂有权束柄标框正此游滚版球盘移简级结罗置行让设请超转轮进键顺鼠

String Lookup Table:
     Char: 上 下 中 于 以 住 体 俄 停 像 先 关 内 出 制 右
    Value: 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F
     Char: 后 向 块 头 左 常 序 应 开 感 戏 所 手 按 控 摄
    Value: 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F
     Char: 文 斯 方 旋 暂 有 权 束 柄 标 框 正 此 游 滚 版
    Value: A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF
     Char: 球 盘 移 简 级 结 罗 置 行 让 设 请 超 转 轮 进
    Value: B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF
     Char: 键 顺 鼠
    Value: C0 C1 C2
*/

使用特权

评论回复
地板
xwj| | 2011-6-10 09:57 | 只看该作者
偶一般是用UE脚本先删除注释,然后提取除字符串保存个文件,然后用HZDotReader打开生成小字库。

HZDotReader有自动删除重码功能,就不用自己做重码剔除了。

使用特权

评论回复
5
xwj| | 2011-6-10 10:01 | 只看该作者
然后所有程序的显示函数都统一为自定义的Printf和printat,直接打印中英文字符串,如果要复杂的格式则先用sprintf处理.

使用特权

评论回复
6
mcuisp|  楼主 | 2011-6-10 10:07 | 只看该作者
:lol各位都有妙计呀,谢过了

使用特权

评论回复
7
huangqi412| | 2011-6-10 10:08 | 只看该作者
MARK

使用特权

评论回复
8
lxyppc| | 2011-6-10 10:26 | 只看该作者
顺便备份个东西
在linux下提取目录和子目录下.h和.c中的字符串到一个指定文件的命令
grep -r -n --include=*.c --include=*.h \"[^\"]*\" * > 123

使用特权

评论回复
9
mcuisp|  楼主 | 2011-6-10 10:35 | 只看该作者
LS这个好东西呀

使用特权

评论回复
10
mohanwei| | 2011-6-10 10:58 | 只看该作者
提示一下:提取C/C++源码里的字符串是一个麻烦的问题(主要是C/C++两种风格混合注释的困扰),尤其是碰到Keil,IAR……这些带扩展的编译器。所以要确保工程编译通过(也就是代码符合规则),删除注释,再提取。
当然如果是自用,代码风格也保持一致,字符串的提取就很简单了。

使用特权

评论回复
11
lxyppc| | 2011-6-10 11:00 | 只看该作者
LS这个好东西呀
mcuisp 发表于 2011-6-10 10:35

只能说将就用用
好多都没考虑,比如包含的文件也会当成字符串,注释中的字符串。
真要做个好用的还得写个工具,单纯用正则表达式处理不出来

使用特权

评论回复
12
mcuisp|  楼主 | 2011-6-10 11:12 | 只看该作者
本帖最后由 mcuisp 于 2011-6-10 11:19 编辑

包含的文件名很难区分,要做语法分析

使用特权

评论回复
13
xwj| | 2011-6-10 12:01 | 只看该作者
所以先要删除注释

使用特权

评论回复
14
mcuisp|  楼主 | 2011-6-10 12:30 | 只看该作者
注释完全没影响呀,通过""对判断,注释被排除

使用特权

评论回复
15
xwj| | 2011-6-10 17:28 | 只看该作者
那//的注释呢?

使用特权

评论回复
16
mohanwei| | 2011-6-10 17:43 | 只看该作者
要是这么简单编译器也不用分步预处理了……
像下面这种代码,keil编译器是认为没问题的:
void main(void)
{
        printf("\"hello,/*这里有一个逗号*/world\",/*第一行asdf*/\
        /*第二行next line:*/hahaha%c",'"');/*这行代码甚至把keil的着色系统都搞蒙了*/
}
这还是常规的,还有一些规则没编译前你会直觉以为是错的……我当初也被这些稀奇古怪的问题搞得头大,最后还是老老实实根据编译原理一步一步处理代码。

使用特权

评论回复
17
mcuisp|  楼主 | 2011-6-10 17:48 | 只看该作者
今天发奋弄出来个工具。分享出来,见附件。
郁闷的是,发现我用的汉字比较多,放单片机FLASH的话,基本都占用完了。还是得外挂字库:'(
FlyMcu HZ Scanner.rar (311.58 KB)

使用特权

评论回复
18
lxyppc| | 2011-6-10 17:59 | 只看该作者
不会是吧注释里的也弄出来了吧

使用特权

评论回复
19
mcuisp|  楼主 | 2011-6-10 18:03 | 只看该作者
没做语法分析,简单的用""来区分的。
注释的也一并出来,呵呵。
另外,注释里边一般不会放""吧。
总之,我是不会往注释里边放""的。

使用特权

评论回复
20
chy117| | 2011-6-10 19:51 | 只看该作者
mark

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:www.mcuisp.com 免费STM32 ISP软件 EP968手持烧录器,现场升级/生产线量产STM32,STM8S/L,FreeScale,LPC2000,LPC9xx,C8051F,AVR,PIC......

340

主题

4985

帖子

22

粉丝