LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 861|回复: 2

请教如何让 isalpha 正确判断非 ascii 的扩展字符。

[复制链接]
发表于 2008-12-2 10:29:16 | 显示全部楼层 |阅读模式
阅读 locale 相关知识的时候知道,ctypes.h 中的各种函数都是可以正确识别 locale 的。例如 isalpha。

但是实际应用中我发现 isalpha , isalnum, isgraph 对所有汉字字符均返回假。

于是我查阅了 libc 源代码,最后发现是读取的本机 locale 信息,然后再看该信息,发现中文 locale 的 lc_ctype 已经包含了 i18n,如果仔细阅读 i18n 里面关于 lc_ctype 的定义的话,会发现这里面已经非常完整的定义了所有的 unicode 字符的类别。理论上,是可以正常识别 alpha, graph, upper, lower 等类型判断的。

当然,如果只传一个单字节字符参数给 isalpha 确实不可能获取整个 unicode 代码,那么究竟是如何处理的呢?这块代码宏太多,又涉及到 tsd 那个跨线程库,实在不容易弄懂,看起来固定是读入到某个数组,然而这个数组是怎么生成的,一直没有看懂。我已经 setlocale 到中国了,应该会让 isalpha 返回真才对,是不是呢?
发表于 2008-12-2 12:20:56 | 显示全部楼层
试试
man iswalpha
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-12-2 13:09:12 | 显示全部楼层
上面的方法确实是可以的。我也知道可行,不过问题在于,如果这么做的话,必须把 utf-8 字符串转换成 wchar 字符串才能处理。这导致了:输入输出是utf-8单字节字符串,内部处理却是wchar字符串。程序中增加太多这种转换显然会显著影响效率。大家是如何处理这个问题的呢?
回复 支持 反对

使用道具 举报

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

本版积分规则

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