批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程
[批处理文件精品]批处理版照片整理器[批处理文件精品]纯批处理备份&还原驱动在线第三方下载
返回列表 发帖

[系统相关] Windows 代码页与字符顺序

本帖最后由 hanyeguxing 于 2011-5-17 10:08 编辑

声明:以下内容为梦游时写的。。。。。

  系统下有一类重要的文件类型被我们忽略:.nls 文件,多国语言资源文件、字符转换;本地语言服务驱动(字体或字体映射) ,编码:UNICODE 。
  在非 Unicode 环境下,由于不同国家和地区采用的字符集不一致,很可能出现无法正常显示所有字符的情况。微软公司使用了代码页(Code page)转换表的技术来过渡性的部分解决这一问题,即通过指定的转换表将非 Unicode 的字符编码转换为同一字符对应的系统内部使用的 Unicode 编码。

1,代码页:

  一种为不同国家(地区)字符集和键盘布局提供支持的方法。代码页是一个表格,它将程序使用的二进制字符代码与键盘上的键或屏幕上显示的字符关联起来。分为单字节代码页(例如 1252 ANSI-拉丁文 I);多字节代码页(例如 936 ANSI/OEM-简体中文 GBK);多字节代码页(例如 54936 GB18030 简体中文)等等。

c_系列 代码页转换表:c_037.nls c_10000.nls c_10001.nls c_10002.nls c_10003.nls c_10006.nls c_10007.nls c_10008.nls c_10010.nls c_10017.nls c_10029.nls c_10079.nls c_10081.nls c_10082.nls c_1026.nls c_1250.nls c_1251.nls c_1252.nls c_1253.nls c_1254.nls c_1255.nls c_1256.nls c_1257.nls c_1258.nls c_1361.nls c_20000.nls c_20127.nls c_20261.nls c_20290.nls c_20866.nls c_20905.nls c_20932.nls c_20936.nls c_20949.nls c_21027.nls c_21866.nls c_28591.nls c_28592.nls c_28593.nls C_28594.NLS C_28595.NLS C_28597.NLS c_28598.nls c_28599.nls c_28603.nls c_28605.nls c_437.nls c_500.nls c_737.nls c_775.nls c_850.nls c_852.nls c_855.nls c_857.nls c_860.nls c_861.nls c_863.nls c_865.nls c_866.nls c_869.nls c_874.nls c_875.nls c_932.nls c_936.nls c_949.nls c_950.nls

  还有 geo.nls、big5.nls、ksc.nls、xjis.nls、ctype.nls、unicode.nls、sorttbls.nls 等等。下面,我们介绍几个关键的 .nls 文件:

2,区域设置:

locale.nls:区域表
编码:UNICODE
位置:C:\WINDOWS\system32
可以在“语言与区域设置”中选择一个代码页作为非 Unicode 编码所采用的默认编码方式。

3,字符顺序:

prcp.nls:汉字拼音顺序映射表
编码:UNICODE
位置:C:\WINDOWS\system32
序号从 80 02 开始,汉字为“吖”,到 D3 E3 结束,汉字为“咗”

prc.nls:汉字部首顺序映射表
编码:UNICODE
位置:C:\WINDOWS\system32
序号从 80 02 开始,汉字为“一”,到 D3 E3 结束,汉字为“龘”

bopomofo.nls:汉字注音顺序映射表
编码:UNICODE
位置:C:\WINDOWS\system32
序号从 80 02 开始,汉字为“ㄅ”,到 D0 DE 结束,汉字为“醟”

  这三个文件里存储的是汉字常用的三个顺序。寒夜孤星提示大家注意,这里说的是汉字,而非中文字符。我们把中文字符分成两大类,即符号和汉字,例如 ⑺ 这是一个中文符号而非汉字,而 ㈦ 是汉字非中文符号,所以 ⑺ 这个字符是不存储在这些中文汉字顺序中的。
  默认,系统是按照汉字拼音顺序排列的,所以“寒”是排在“夜”前面的。如果我们想要更改这个顺序,可以修改 prcp.nls 文件中的对应汉字,例如将他们两个调换一下位置,那么重新启动系统后,无论在命令行中,还是在图形界面下,这个顺序都将发生改变。当然,如果想把系统默认的拼音顺序该为部首顺序或注音顺序,只要将这些文件的文件名对调也可以。
  寒夜孤星提示:这么重要的文件,系统是会保护的,所以 dllcache 目录下是有他们的备份的哦,其他 .nls 也是如此!~

sortkey.nls:顺序映射表
编码:UNICODE
位置:C:\WINDOWS\system32
此文件记录字符的顺序排列,并且记录的是序号。
⒈字符的顺序按照符号、数字、字母、汉字、罕见符号的顺序排列。
⒉汉字部分默认按拼音排列。
⒊中文类符号则按其功能插入到相应的分类中并放到对应英文符号的后面。
⒋中文符号 〇 位于所有可打印字符最前。

  例如句号 。 插入到符号类中并位于英文句号点 . 的后面; 5 ⑤ ⒌ 这三个字符插入到数字类并放到数字 5 的后面

  在 cmd.exe 中命令分为两大类:
第一类如 if 、sort 等,按以上顺序排列字符;其他 32 位程序绝大多数也是如此,例如资源管理器、外壳程序等等。
第二类如 set 、dir 、for 等,按 UNICODE 编码顺序排列,不使用 sortkey.nls 顺序。
注:由于篇幅原因就不展开 if 比较时 〇 - 大小写等的特例说明。
2

评分人数

    • qzwqzw: 捅破的不止一层纸技术 + 1
    • plp626: 精品,但不是谁懂得欣赏技术 + 1
寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

网上关于NLS文件的资料很少,很好奇LZ是怎么得出这些结论的,可否分享一下。

TOP

本帖最后由 wankoilz 于 2012-3-21 13:47 编辑

有意思,怎么没下文了?
我觉得把“代码页”换成“内码页”是不是要准确一点?

TOP

6# hanyeguxing
1、微软的文档不止一处有问题
这里我保留意见

3、prcp.nls删除后会直接影响系统的启动
在我的测试环境下(XPSP2 administrator 空密码 自动登陆)
启动时多次报内存不能读的错误
然后出现登陆对话框
使用空密码确定后无响应

2、4:不明白你说的是什么
可以说的再多一点吗?
天的白色影子

TOP

本帖最后由 hanyeguxing 于 2011-5-17 12:06 编辑

5# qzwqzw


1,那是俺唯一一句引用了微软的话:ms-its:C:\WINDOWS\Help\glossary.chm::/glossary_pro.htm#gls_code_page
2,所有的.nls数据文件本身也可以是一个提供转换函数的动态链接库。
3,prcp.nls和prc.nls这些转换表特殊在于即使被删除,也不影响字符的各种使用,仅影响顺序而已,所以单独列出来。
4,sorttbls.nls只定义相关转换表之间的关系,他并不具体定义某两个字符之间谁先谁后。
寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

1# hanyeguxing
一种为不同国家(地区)字符集和键盘布局提供支持的方法。代码页是一个表格,它将程序使用的二进制字符代码与键盘上的键或屏幕上显示的字符关联起来。

代码页Code Page与键盘布局应该没有关系
键盘布局MSDOS时是受keyboard code控制的
keyb.com就是切换键盘代码的工具
在Windows NT下应该是受kbd开头的一系列动态链接库文件控制
至于键盘上键与二进制字符代码的关联
通常还会收到输入法的控制

对于prc.nls、prcp.nls、ksc.nls等是顺序映射表的概念我不太赞同
我认为这也是一种unicode与各种不同字符集之间的代码转换表
80 02 不过是对应字符集的编码而已
prc:Peoples Republic of Chinese
真正的排序映射表应该是sorttbls.nls (sort tables)
天的白色影子

TOP

本帖最后由 plp626 于 2011-5-16 19:58 编辑

3# neorobin

http://www.unicode.org/reports/tr10/#Stability

这么重要的文献 ~~~

UCA(Unicode 校勘算法) 还是头一次听说,中文这方面的资料好少,

http://en.wikipedia.org/wiki/Unicode_collation_algorithm
The Unicode collation algorithm (UCA) is an algorithm defined in Unicode Technical Report #10, which defines a customizable method to compare two strings. These comparisons can then be used to collate or sort text in any writing system and language that can be represented with Unicode.

TOP

近日, 字符, 字符串, 比较, 次序, 编码等 这些东西有些热度, 要有大的收益, 觉得 UNICODE 不可不学, 暂觉吃力.
前日在一外文论坛 stackoverflow.com 上问了一个未明白的老问题: 减号和单引号在 IF 比较中的作用或规则,
一个德国人给了我一个 UNICODE 的官方链接 http://www.unicode.org/reports/tr10/#Stability
并且让我极深印象的有这样的一段引用:
x < y does not imply that xz < yz
x < y does not imply that zx < zy
xz < yz does not imply that x < y
zx < zy does not imply that x < y
1

评分人数

TOP

楼主终于肯梦游了
真复杂,谁掐我一下,我感觉我在做梦...

TOP

返回列表