中文字符集

中文字符集
中文字符集

最近一直被这个字符集问题,弄的头疼。想不到一个很好的办法去解决。问题是这样的:“在超链接中传递参数的时候总是出现乱码”在Action中用debug查的时候就是乱码,在Tomcat 中把Service.xml将字符集改成UTF-8,GBK,GB2312都试过了,仍然没有解决这个问题。很是郁闷!~~~

在现实工作中我们会经常遇到字符转换的问题:有的时候还会出现乱码.因为工作需要我从别人的静态网页上抓取数据.用到的方法是传一个uri进去,然后取出你所想得到的字符串.代码如下:

public static String getData(String url1) throws Exception {

String result = "";

URL url = new URL(url1);

HttpURLConnection connection = (HttpURLConnection) url.openConnection();

connection.setDoOutput(true);

PrintWriter out = new PrintWriter(connection.getOutputStream());

out.close();

BufferedReader in = new BufferedReader(new InputStreamReader(connection.

getInputStream(),"UTF-8"));

//特别注意这里,后面的编码格式,一般都是用UTF-8,因为这是通用的.如果用汉字可以用GBK.不要用gb2312.因为它是GBK的子集.

String line;

while ( (line = in.readLine()) != null) {

result = result + "\n" + line;

}

in.close();

String html =replaceFunc2(replaceFunc2(result,""),"

","");

return html;

}

public static String replaceFunc2(String str_source, String str_start,String str_end)

{

String info = "", rep_str = "", rep_str2 = "";

int startFlag = 0, endFlag = 0;

startFlag = str_source.indexOf(str_start);

endFlag = str_source.indexOf(str_end);

info = str_source;

if (startFlag >= 0 && endFlag >= 0 && startFlag < endFlag) {

rep_str = info.substring(0, startFlag);

rep_str2 = info.substring(endFlag + str_end.length());

info = rep_str + rep_str2;

}

// System.out.print("==========="+info+"==========");

return info;

}

这样我们取的时候就是强制它用UTF-8的格式从网页中读取出来,而不用它自己默认的编码方式(鬼知道它是用的什么编码格式,因为我是从aspx?xxx动态网页中取的,),听说有一种方法可以查出来它是用的什么编码方式,估计没多少人有这耐心去查.只要读取时用某种格式强制读取就可以,然后用相同的编码方式显示出来,一般没有什么问题.

还有一个就是听别人说的,如果还是出现乱码,哪就先把它转化成unicode格式(UTF-16),这种格式我原来没听说过,又学了一种格式,然后再转成UTF-8的格式.

下面是一些方法.从网上转来的:

网页写的中文不需要转换,写上你那行就可以显示中文了。凡从jsp传出带中文值的参数,都需要在接收后转换中文<%@ page contentType="text/html; charset=GB2312"%> 是要在本页显示中文的时候才写。它不能完成转换中文的功能。

中文问题是java世界里面一个比较麻烦的问题,说麻烦是因为涉及面太宽,由数据库方面的,操作系统的,webserver的等等。

一般这个就可以了:

str = new String(str.getBytes("编码1"),"编码2");其中编码1是操作系统的默认编码,编码2是你要转换成的编码。

new String()里面的部分的意思是:把str转按照编码1的方式转换回byte[] 字节流,然后按照编码2的方式再转换成新的str。(str是一个字符串,java里面其实是char[])。str = new String(str.getBytes(),"编码2");编码1省略也是可以的,会按照操作系统的默认编码来转换。其中编码2一般为gb2312,也就是中文,但是推荐用gbk,因为gb2312其实是gbk的一个子集,字库要小一些。utf-8应该也可以,是较新的一种编码规则。

Java Servlets 2.3规范草案在ServletRequest接口中新增了一个方法setCharacterEncoding(String enc),可以补上在HTTP请求中缺少的charset信息,而上面这一烦琐的转换过程就在Servlet引擎中自动完成了,而且Servlet引擎还对转换过程做了优化,提高了运行效率。下面给出一个简单的例子,大家可以做一下比较。

// 传统方式

<%@ page contentType="text/html; charset=gb2312" %>

<%= new String(request.getParameter("your_name").getBytes("8859_1"), "GB2312") %>

// 新的方式

<%@ page contentType="text/html; charset=gb2312" %>

<% request.setCharacterEncoding("GB2312"); %>

<%= request.getParameter("your_name") %>

比较常用的SmartUpload中,可能不支持中文,需要修改:

response.setHeader("Content-Disposition","attachment;filename="+https://www.360docs.net/doc/205477102.html,.URLEncoder.encode( (attachname,"utf-8/iso-8895-1/gb2312")));将attachname编码格式修改才可以使得在弹出的下载确认框中显示中文

一般来说可以有两个方法:

1.URLEncoder.encode(str,"utf-8");按utf-8编码输出

2.String temp=str;

str= new String(tempgetBytes(), "iso-8859-1");

当然这和你的系统编码有关系,一般建议使用utf-8编码。

当然,也不止上面两个方法,比如可以转换成gbk等,只要你熟悉你的字符串和系统的编码方式,如何转码就很容易了。

当然这两种方法都有些局限性,但一般情况下是够用了,对于跨操作系统,跨语言的环境,略微有些问题,这和你操作系统的字符库有关系。

希望跟我有着同样烦恼的兄弟们,能有些帮助~~~~

常用字符集编码详解:ASCII 、GB2312、GBK、GB18030、...

ASCII ASCII码是7位编码,编码范围是0x00-0x7F。ASCII字符集包括英文字母、阿拉伯数字和标点符号等字符。其中0x00-0x20和0x7F共33个控制字符。 只支持ASCII码的系统会忽略每个字节的最高位,只认为低7位是有效位。HZ字符编码就是早期为了在只支持7位ASCII系统中传输中文而设计的编码。早期很多邮件系统也只支持ASCII编码,为了传输中文邮件必须使用BASE64或者其他编码方式。 GB2312 GB2312是基于区位码设计的,区位码把编码表分为94个区,每个区对应94个位,每个字符的区号和位号组合起来就是该汉字的区位码。区位码一般用10进制数来表示,如1601就表示16区1位,对应的字符是“啊”。在区位码的区号和位号上分别加上0xA0就得到了GB2312编码。 区位码中01-09区是符号、数字区,16-87区是汉字区,10-15和88-94是未定义的空白区。它将收录的汉字分成两级:第一级是常用汉字计3755个,置于16-55区,按汉语拼音字母/笔形顺序排列;第二级汉字是次常用汉字计3008个,置于56-87区,按部首/笔画顺序排列。一级汉字是按照拼音排序的,这个就可以得到某个拼音在一级汉字区位中的范围,很多根据汉字可以得到拼音的程序就是根据这个原理编写的。 GB2312字符集中除常用简体汉字字符外还包括希腊字母、日文平假名及片假名字母、俄语西里尔字母等字符,未收录繁体中文汉字和一些生僻字。可以用繁体汉字测试某些系统是不是只支持GB2312编码。 GB2312的编码范围是0xA1A1-0x7E7E,去掉未定义的区域之后可以理解为实际编码范围是0xA1A1-0xF7FE。 EUC-CN可以理解为GB2312的别名,和GB2312完全相同。 区位码更应该认为是字符集的定义,定义了所收录的字符和字符位置,而GB2312及EUC-CN是实际计算机环境中支持这种字符集的编码。HZ和ISO- 2022-CN是对应区位码字符集的另外两种编码,都是用7位编码空间来支持汉字。区位码和GB2312编码的关系有点像Unicode和UTF-8。 GBK GBK编码是GB2312编码的超集,向下完全兼容GB2312,同时GBK收录了Unicode基本多文种平面中的所有CJK汉字。同GB2312一样,GBK也支持希腊字母、日文假名字母、俄语字母等字符,但不支持韩语中的表音字符(非汉字字符)。GBK还收录了GB2312不包含的汉字部首符号、竖排标点符号等字符。 GBK的整体编码范围是为0x8140-0xFEFE,不包括低字节是0×7F的组合。高字节范围是0×81-0xFE,低字节范围是0x40-7E和0x80-0xFE。

字符编码

1、什么是字符编码,为什么要字符编码? 2、区分“字符集”和“编码” 3、几种常用的字符编码。 首先介绍一下拉丁字母: 拉丁字母,也叨罗马字母,是当仂丐界上使用最广的字母系统。 拉丁字母,戒者说基本的拉丁字母,就是你所常见的到的ABCD 等26 个英文字母。 原先是欧洲那边使用的,后来由亍欧洲殖民主义,导致后来的美洲等地,也是用的这套字 母体系。 而其他有些地方,比如越南等,本来有自己的文字语言的,结果受西斱文化的影响和由亍 基督教的传播,也用拉丁字母了。 所以总的说,现在欧洲多数国家,美洲,澳洲,非洲的多数国家,都是用的拉丁字母,即 你所常见的英文字母,也是拉丁字母。而中国的汉语拼音,也是用的这个拉丁字母。 那字符编码是什么? 计算机中存放的都是0 和1 的二进制值。8 个位对应一个字节,常用16 迚制来表示。 而我们普通用户所希望看到的是,计算机把其所存储的对应的16 迚制的数值,转化为对 应的字符,包括英文和中文等其他语言的字符,然后输出到屏幕上。而所谓编码,就是,定义了一套规则,去指定,哪些数值,对应着哪些字符。举个最简单的例子,常见65=0x41 对应的是大写字母A,97=0x61 对应的是小写字母a,而这套数值和字母之间的映射兰系,说白了,就是一套规则,就叫做字符编码,即我们常说 的ASCII 编码。 所以字符编码就是:定义了一套规则,指定了计算机中存放的这么多值中的哪个值,对应 了电脑屏幕显示出来的哪个字母。 区分一下“字符集”和“编码” 使用哪些字符。也就是说哪些汉字,字母和符号会被收入标准中。所包含“字符”的集合就叫做“字符集”。 规定每个“字符”分别用一个字节还是多个字节存储,用哪些字节来存储,这个规定就叫做“编码”。 各个国家和地区在制定编码标准的时候,“字符的集合”和“编码”一般都是同时制定的。因此,平常我们所说的“字符集”,比如:GB2312, GBK, JIS 等,除了有“字符的集合”这层含义外,同时也包含了“编码”的含义。 区分一下“字符集”和“编码”的概念很重要,因为有的字符集有多种“编码”实现。 下面介绍几种具体的字符编码。 大致按照它们出现的先后顺序进行介绍。 计算机刚出现的旪候,虽然是美国人发明的,但是也要面对一个问题,即如何将对应的计 算机中的数值,转化为对应的字母,而显示出来,即采用什么样的规则,而当时,各个厂

常用字符集介绍和编码转换原理

常用字符集介绍和编码转换原理 目录 1. GB2312编码介绍 (2) 1.1 基本信息 (2) 1.2 GB标准 (2) 1.3 分区表示 (2) 1.4 字节结构 (2) 2. 通用字符集UCS (3) 2.1 定义 (3) 2.2 概要 (3) 2.3 实现级别 (3) 2.4 与UNICODE的兼容关系 (3) 3. unicode编码介绍 (3) 3.1 基本简介 (4) 3.2 编码实现 (4) 3.2.1 编码方式 (4) 3.2.2 实现方式 (5) 4. UTF-8介绍 (5) 4.1 基本介绍 (5) 4.2 编码原理 (5) 4. 转换原理 (7)

1. GB2312编码介绍 1.1 基本信息 1.2 GB标准 GB2312或GB2312-80是一个简体中文字符集的中国国家标准,全称为《信息交换用汉字编码字符集·基本集》,又称为GB0,由中国国家标准总局发布,1981年5月1日实施。GB2312编码通行于中国大陆;新加坡等地也采用此编码。中国大陆几乎所有的中文系统和国际化的软件都支持GB2312。 GB2312标准共收录6763个汉字,其中一级汉字3755个,二级汉字3008个;同时,GB2312收录了包括拉丁字母、希腊字母、日文平假名及片假名字母、俄语西里尔字母在内的682个全角字符。 GB2312的出现,基本满足了汉字的计算机处理需要,它所收录的汉字已经覆盖中国大陆99.75%的使用频率。 对于人名、古汉语等方面出现的罕用字,GB2312不能处理,这导致了后来GBK及GB18030汉字字符集的出现。 1.3 分区表示 GB 2312中对所收汉字进行了―分区‖处理,每区含有94个汉字/符号。这种表示方式也称为区位码。 01-09区为特殊符号。 16-55区为一级汉字,按拼音排序。 56-87区为二级汉字,按部首/笔画排序。 10-15区及88-94区则未有编码。 举例来说,―啊‖字是GB2312之中的第一个汉字,它的区位码就是1601。 1.4 字节结构

信息交换用汉字编码字符集

〇信息交换用汉字编码字符集--基本集〈—即国家标准 GB2312-80 从1975年开始,我国为了研究汉字的使用频度,进行了大规模的字频统计工作,内容包括工业、农业、军事、科技、政治、经济、文学、艺术、教育、体育、医药卫生、天文地理、自然、化学、文字改革、考古等多方面的出版物,在数以亿计的浩瀚文献资料中,统计出实际使用的不同的汉字数为6335个,而其中有3000多个汉字的累计使用频度达到了99.9%,而另外的3000多个累计频度不到0.1%,说明了常用汉字与次常用汉字的数量不足7000个,这就为国家制定汉字库标准提供了依据。 1980年颁布了〇信息交换用汉字编码字符集—基本集〈的国标交换码,国家标准号为:GB2312-80,选入了6763个汉字,分为两级,一级字库中有3755个,是常用汉字,二级字库中有3008个,是次常用汉字;还选入了682个字符,包含有数字、一般符号、拉丁字母、日本假名、希腊字母、俄文字母、拼音符号、注音字母等。以前我国大陆的各种中文DOS版本、Windows3.1 /3.2版本,装入的字库都是国标一二级字库。 〇GB2312-80〈对 7445 个图形字符作了二进制数编码,这些图形字符是: 6763 个汉字,字体为简化字,分成两级。第一级汉字 3755 个,按拼音排序,约占近代文献汉字累计使用频度 99.9% 左右;二级汉字 3008 个,按部首、笔画排序。一、二级汉字约占累计使用频度 99.99% 以上。 202 个一般符号。其中包括 1.~20.,(1)~(20),?~?,(-)~(+) 等。 22 个数字。其中 0~9 共 10 个,‥~‰ 共 12 个。 52 个拉丁字母。其中大写字母A~Z 26 个,小写字母a~z 26 个。 169 个日文假名。其中平假名 83 个,片假名 86 个。 48 个希腊字母。其中大写字母Α~Χ24 个,小写字母α~ω24 个。 66 个俄文字母。其中大写字母А~Я33 个,小写字母а~я 33 个。 26 个汉语拼音符号,包括带声调符号和其它符号的字母。 37 个汉语注音字母,?~ㄗ。 GB2312简体中文编码表 code +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F A1A0 、。? í ì ¨ 〃?—~‖ … ‘ ’ A1B0 “ ” 【】々〆〇〈〉《》「〒〓」『 A1C0 a ? ? ? ?  ̄ ? ? ? ? ‵ ? ? ? ? ※ A1D0 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? A1E0 ? ? ? ? ? ? ? $¤ ??? § ? ? ? A1F0 ? ? ? ? ? ? ? ? ? ? ″ ? ′ ? 』 code +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F A2A0 ⅰ ⅱ ⅲ ⅳ ⅴ ⅵ ⅶ ⅷ ⅸ ⅹ A2B0 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

aix 6.1 安装中文字符集

AIX 6.1 有2张系统安装碟,安装中文字符集UTF、GB***需要2张系统碟交替安装进行。 步骤一 在部署一些应用程序的时候,有时候需要用到一些系统没有安装的字符集,这时候就需要安装字符集,具体方法如下: 1.查看操作系统当前字符集: # locale 2.查看操作系统已安装字符集: # locale -a 3.安装新字符集: 放入操作系统光盘: 4. 插入disk2,root用户登入系统,挂载光驱: #mount -rv cdrfs /dev/cd0 /mnt #smit lang ---->Add Additional Language Environments ---->CULTURAL convention to install;LANGUAGE translation to install 这两项里Esc+4或F4展开列表选择需要安装的字符集。ZH_CN后缀的为简体中文,选择以UTF和GB开头,ZH_CN结尾的中文字符集包(Esc+7或F7选中,选中后左边有箭头指向),回车确认。如果安装失败,会提示需要哪些filesets未安装。一般情况下为下列6个:xlC.msg.ZH_CN.cpp bos.loc.utf.ZH_CN bos.loc.iso.Zh_CN X11.loc.Zh_CN.base.rte X11.loc.ZH_CN.base.rte Java5.msg.Zh_CN ***注意大小写,AIX中大小写不同,系统认为的文件时不一样的*** 步骤二 Filesets有先后依赖关系,需要依次顺序安装。 首先执行unmount /mnt,取出disk2,插入disk1,挂载光驱mount -rv cdrfs /dev/cd0 /mnt,执行下列命令安装以下3个filesets: installp -ac -d/mnt/installp/ppc X11.fnt.ucs.ttf_extb installp -ac -d/mnt/installp/ppc https://www.360docs.net/doc/205477102.html,.utf installp -ac -d/mnt/installp/ppc bos.iconv 执行unmount /mnt,取出disk1,插入disk2,挂载光驱mount -rv cdrfs /dev/cd0 /mnt,依次执行以下命令安装其余的filesets: installp -ac -d/mnt/installp/ppc X11.fnt.ucs.ttf_CN installp -ac -d/mnt/installp/ppc Java5.msg.Zh_CN installp -ac -d/mnt/installp/ppc X11.loc.ZH_CN.base.rte installp -ac -d/mnt/installp/ppc X11.loc.Zh_CN.base.rte installp -ac -d/mnt/installp/ppc https://www.360docs.net/doc/205477102.html,

0023算法笔记——【贪心算法】哈夫曼编码问题

0023算法笔记——【贪心算法】哈夫曼编码问题 1、问题描述 哈夫曼编码是广泛地用于数据文件压缩的十分有效的编码方法。其压缩率通常在20%~90%之间。哈夫曼编码算法用字符在文件中出现的频率表来建立一个用0,1串表示各字符的最优表示方式。一个包含100,000个字符的文件,各字符出现频率不同,如下表所示。 有多种方式表示文件中的信息,若用0,1码表示字符的方法,即每个字符用唯一的一个0,1串表示。若采用定长编码表示,则需要3位表示一个字符,整个文件编码需要300,000位;若采用变长编码表示,给频率高的字符较短的编码;频率低的字符较长的编码,达到整体编码减少的目的,则整个文件编码需要(45×1+13×3+12×3+16×3+9×4+5×4)×1000=224,000位,由此可见,变长码比定长码方案好,总码长减小约25%。 前缀码:对每一个字符规定一个0,1串作为其代码,并要求任一字符的代码都不是其他字符代码的前缀。这种编码称为前缀码。编码的前缀性质可以使译码方法非常简单;例如001011101可以唯一的分解为0,0,101,1101,因而其译码为aabe。

译码过程需要方便的取出编码的前缀,因此需要表示前缀码的合适的数据结构。为此,可以用二叉树作为前缀码的数据结构:树叶表示给定字符;从树根到树叶的路径当作该字符的前缀码;代码中每一位的0或1分别作为指示某节点到左儿子或右儿子的“路标”。 从上图可以看出,表示最优前缀码的二叉树总是一棵完全二叉树,即树中任意节点都有2个儿子。图a表示定长编码方案不是最优的,其编码的二叉树不是一棵完全二叉树。在一般情况下,若C是编码字符集,表示其最优前缀码的二叉树中恰有|C|个叶子。每个叶子对应于字符集中的一个字符,该二叉树有|C|-1个内部节点。 给定编码字符集C及频率分布f,即C中任一字符c以频率f(c)在数据文件中出现。C的一个前缀码编码方案对应于一棵二叉树T。字符c在树T中的深度记为d T(c)。d T(c)也是字符c的前缀码长。则平均码长定义为:

中文字符集

最近一直被这个字符集问题,弄的头疼。想不到一个很好的办法去解决。问题是这样的:“在超链接中传递参数的时候总是出现乱码”在Action中用debug查的时候就是乱码,在Tomcat 中把Service.xml将字符集改成UTF-8,GBK,GB2312都试过了,仍然没有解决这个问题。很是郁闷!~~~ 在现实工作中我们会经常遇到字符转换的问题:有的时候还会出现乱码.因为工作需要我从别人的静态网页上抓取数据.用到的方法是传一个uri进去,然后取出你所想得到的字符串.代码如下: public static String getData(String url1) throws Exception { String result = ""; URL url = new URL(url1); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setDoOutput(true); PrintWriter out = new PrintWriter(connection.getOutputStream()); out.close(); BufferedReader in = new BufferedReader(new InputStreamReader(connection. getInputStream(),"UTF-8")); //特别注意这里,后面的编码格式,一般都是用UTF-8,因为这是通用的.如果用汉字可以用GBK.不要用gb2312.因为它是GBK的子集. String line; while ( (line = in.readLine()) != null) { result = result + "\n" + line; } in.close(); String html =replaceFunc2(replaceFunc2(result,""); return html; } public static String replaceFunc2(String str_source, String str_start,String str_end) { String info = "", rep_str = "", rep_str2 = ""; int startFlag = 0, endFlag = 0; startFlag = str_source.indexOf(str_start); endFlag = str_source.indexOf(str_end); info = str_source; if (startFlag >= 0 && endFlag >= 0 && startFlag < endFlag) { rep_str = info.substring(0, startFlag); rep_str2 = info.substring(endFlag + str_end.length()); info = rep_str + rep_str2; } // System.out.print("==========="+info+"=========="); return info; }

查看Oracle字符集及如何修改字符集

查看Oracle字符集及如何修改字符集 文章分类:数据库 一、什么是oracle字符集 Oracle字符集是一个字节数据的解释的符号集合,有大小之分,有相互的包容关系。ORACLE 支持国家语言的体系结构允许你使用本地化语言来存储,处理,检索数据。它使数据库工具,错误消息,排序次序,日期,时间,货币,数字,和日历自动适应本地化语言和平台。 影响oracle数据库字符集最重要的参数是NLS_LANG参数。 它的格式如下: NLS_LANG = language_territory.charset 它有三个组成部分(语言、地域和字符集),每个成分控制了NLS子集的特性。 其中: Language 指定服务器消息的语言,territory 指定服务器的日期和数字格式,charset 指定字符集。如:AMERICAN _ AMERICA. ZHS16GBK 从NLS_LANG的组成我们可以看出,真正影响数据库字符集的其实是第三部分。 所以两个数据库之间的字符集只要第三部分一样就可以相互导入导出数据,前面影响的只是提示信息是中文还是英文。 二.查看数据库字符集 这涉及三方面的字符集, 一是oracel server端的字符集; 二是oracle client端的字符集; 三是dmp文件的字符集。 在做数据导入的时候,需要这三个字符集都一致才能正确导入。 1、查询oracle server端的字符集 有很多种方法可以查出oracle server端的字符集,比较直观的查询方法是以下这种: SQL>select userenv(‘language’) from dua l; 结果类似如下:AMERICAN _ AMERICA. ZHS16GBK 2、如何查询dmp文件的字符集 用oracle的exp工具导出的dmp文件也包含了字符集信息,dmp文件的第2和第3个字节记录了dmp文件的字符集。如果dmp文件不大,比如只有几M或几十M,可以用UltraEdit 打开(16进制方式),看第2第3个字节的内容,如0354,然后用以下SQL查出它对应的字符集: SQL> select nls_charset_name(to_number('0354','xxxx')) from dual; ZHS16GBK 如果dmp文件很大,比如有2G以上(这也是最常见的情况),用文本编辑器打开很慢或者完全打不开,可以用以下命令(在unix主机上): catexp.dmp |od -x|head -1|awk '{print $2 $3}'|cut -c 3-6 然后用上述SQL也可以得到它对应的字符集。 3、查询oracle client端的字符集 这个比较简单。 在windows平台下,就是注册表里面相应OracleHome的NLS_LANG。还可以在dos窗口里面自己设置,比如: setnls_lang=AMERICAN_AMERICA.ZHS16GBK 这样就只影响这个窗口里面的环境变量。

《统一的中日韩汉字编码字符集》(CJK)字根系统研究

《统一的中日韩汉字编码字符集》(CJK)字根系统研究 《统一的中日韩汉字编码字符集》(CJK)作为新的汉字信息处理国际标准,使汉字信息处理向国际化方向迈出了重要的一步,对汉字字形的定量定性研究也提出了更高的要求。在此基础上,依靠计算机字形技术的支持,采用字根分解与合成的方法,有可能表示出CJK的全部字符从而实现其无字库化处理。因此,研究CJK字根系2统,对于CJK的工程应用具有重要作用。 中日韩汉字字形有别而音义互异,但都是可分析的文字,其基本构形单位都是笔画或字根,因此,字根分析法对其同样适用。本文认为,要得出一个较为科学的CJK字根系统,在理论和实践上必须着重解决两个问题,一个是笔画与字根的分野即单笔字根的问题,另一个就是字根变体的问题。本文主要分析了CJK的单笔字根和字根变体,并对统计得出的CJK676个字根的有关数据进行了系统的分析,希望能为CJK的相关研究提供参考。 一、CJK的单笔字根 (一)为什么要提出"单笔字根" 字根是汉字字符的直接构形成分,是可以独立运用的最小构形单位。一般说来,字根包含两个以上笔画,但当单一笔画与字根直接参与汉字字符构形时,这一笔画由于具备了字根的价值和功能而上升到字根层级,称为"单笔字根"。提出这一概念主要基于以下考虑: 1、汉字字符的构形成分中确实存在许多相对独立的单一笔画,归入邻近的任一字根都不合适,CJK中就有400多个字符包含这种笔画。如果说汉字字符都是由作为笔画组合体的字根构成的,显然不符合事实;如果说汉字字符是由字根与笔画组成的,固然也未尝不可,但这样就难以清晰地体现字符构形的层级性,故"单笔字根"的提出有其现实的必要性。 2、CJK字符集收入了"一丨丶丿乀乁乙乚乛亅"十个单笔画的字符,如果不引入"单笔字根"的概念,则这十个字符无法进行字根分析。 3、适当拆出字符中的单笔字根,可以大大简化字根系统。 (二)如何析出单笔字根 笔画与字根毕竟是不同层级的构形成分,因此单笔字根以尽量少析出为宜。我们在分析CJK单笔字根的过程中,主要采用了以下方法: 1、某一单笔画如果与字符中其它笔画处于相交或相接的关系,则不能析为单笔字根。如"子、孑、孓"都是由字根"了"与单笔画相交或相接而成,故不再析出单笔字根。 2、如果单笔画与字符中其它笔画均处于相离的关系,则根据以下情况处理: (1)对于点笔来说,若其与某一字根呈内聚之势,且作为整体具有构字能力,则合为一个字根,如"犬、太、刃、玉"等;反之,若作为整体无构字能力,则立点笔为单笔字根,如"乓"。这样处理可使字根系统的层级性得以体现,同时也照顾了通常的字根拆分习惯。 (2)如果某一单笔画用另一笔画或字根替换后成了另一字符,则只能析为单笔字根,如"糺"中的"乚"替换为"工"后成了另一字符"紅",因此"乚"为单笔字根。能用这种方法来判断的单笔字根在CJK单笔字根中约占24%。 (3)偏旁部首通常使用频率较高,一般作为整体进入字根系统,不再拆出单笔字根,如"纟"、"刂"、"寸"、"灬"等。 为简化字根系统,有时也需要作变通处理,如"示"中与第一横笔相邻的也不是分笔字根,但将其析出后,余部分无构字能力,为简化字根系统,"示"拆为"二、小",不涉及单笔字根问题。 (三)CJK的单笔字根统计 我们采用上述方法得出了CJK单笔字根的有关数据,详见下表: 如果把提归入横,捺归入点,竖钩归入竖,其它的归入折,则五种基本笔画在CJK中

计算机常见编码

计算机常见编码 一.有关编码的基础知识 1. 位bit 最小的单元 字节byte 机器语言的单位 1byte=8bits 1KB=1024byte 1MB=1024KB 1GB=1024MB 2. 二进制binary 八进制octal 十进制decimal 十六进制hex 3. 字符:是各种文字和符号的总称,包括各个国家的文字,标点符号,图形符 号,数字等。 字符集:字符集是多个符号的集合,每个字符集包含的字符个数不同。 字符编码:字符集只是规定了有哪些字符,而最终决定采用哪些字符,每一 个字符用多少字节表示等问题,则是由编码来决定的。计算机要 准确的处理各种字符集文字,需要进行字符编码,以便计算机能 够识别和存储各种文字。 二.常见字符集的编码介绍: 常见的字符集有:ASCII 字符集,GB2312 字符集,BIG5 字符集,GB18030 字符集,Unicode 字符集,下面一一介绍: 1. ASCII 字符集: 定义: 美国信息互换标准代码,是基于罗马字母表的一套电脑编码系统,主要显示 英语和一些西欧语言,是现今最通用的单字节编码系统。 包含内容: 控制字符(回车键,退格,换行键等) 可显示字符(英文大小写,阿拉伯数字,西文符号) 扩展字符集(表格符号,计算符号,希腊字母,拉丁符号) 编码方式: 第0-31 号及127 号是控制字符或通讯专用字符; 第32-126 号是字符,其中48-57 号为0-9 十个阿拉伯数字,65-90 号为26 个 大写英文字母,97-122 号为26 个英文小写字母,其余为一些标点符号,运 算符号等。 在计算机存储单元中,一个ASCII 码值占一个字节(8 个二进制位),最高位 是用作奇偶检验位。【奇偶校验是指:在代码传送的过程中,用来检验是否 出错的一种方法。】奇偶校验分为奇校验和偶校验。奇校验规定:正确的代 码一个字节中1 的个数必须是奇数,若非奇数,则在最高位添1;偶校验规 定:正确的代码一个字节中 1 的个数必须是奇数,若非奇数,则在最高位添 1。

关于字符集和乱码的思考

关于字符集和乱码的思考 关于字符集和乱码的思考2011-12-12 16:05:58 分类:Delphi 重要提示:本文并非学术文章,本人也并非语言和文字学领域人士,只是出于好奇心,根据自己的理解写下这篇文章。本文的参考文档都来源于互联网,而且并未一一考证其准确性和权威性,因此本文仅供参考。 字符集和字符编码的问题一直困扰着我,之间曾经多次尝试把这个问题理解清楚,但始终由于有些细节问题无法自圆其说因而放弃。网上的资料多数描述过于简单,又或者作者本人对问题也了解不深入,容易产生误导。最近我终于下定决心将之前对“乱码”问题的思考更进一步,否则将始终是一丝遗憾。这里也不得不感叹,老外的“科普”做的好啊,网上有很多质量相当高的文章,表述严密,引用充分,例证丰富,我相信在国内各领域的专家也不少,计算机和语言学方

面都有很多有建树的大牛,也许是太忙吧。对我个人而言,最重要的一片文章是“Character set encoding basics”,在本文最后有链接的地址,本人的翻译版本在这里: https://www.360docs.net/doc/205477102.html,/space.php?uid=11187&do=b log&id=3034493 1.字符集的基本概念 什么是字符集?什么是字符编码? 按照“Character set encoding basics”文中的定义,字符集的编码模型分为以下4个层次 1)抽象字符清单Abstract character repertoire (ACR),无序,无编码; 2)已编码字符集Coded character set (CCS),有序,有编码; 3)字符编码规则Character encoding form (CEF),有序,有编码; 4)字符编码方案Character encoding scheme (CES),有序,有编码,有传输和储存规则(字节序); 这种分层方式,比较偏于学术化,不太容易理解。按我个人的理解,GB2312/GBK/GB18030/ASCII这些字符集编码规则,由于都基于8-bit字节,是属于前三层的,可以认为是三

各种字符编码间的转换方法:MultiByteToWideChar和MultiByteToWideChar

MultiByteToWideChar和MultiByteToWideChar对各种字符编码间的转换 函数原型: int WideCharToMultiByte( UINT CodePage, DWORD dwFlags, LPCWSTR lpWideCharStr, int cchWideChar, LPSTR lpMultiByteStr, int cbMultiByte, LPCSTR lpDefaultChar, LPBOOL lpUsedDefaultChar ); 此函数把宽字符串转换成指定的新的字符串,如ANSI,UTF8等,新字符串不必是多字节字符集。参数: CodePage:指定要转换成的字符集代码页,它可以是任何已经安装的或系统自带的字符集,你也可以使用如下所示代码页之一。 参数说明: 1、CodePage——指定要转换成的字符集代码页,它可以是任何已经安装的或系统自带的字符集,可选择以下代码页: CP_ACP //当前系统ANSI代码页 CP_MACCP //当前系统Macintosh代码页 CP_OEMCP //当前系统OEM代码页,一种原始设备制造商硬件扫描码CP_SYMBOL //Symbol代码页,用于Windows 2000及以后版本 CP_THREAD_ACP //当前线程ANSI代码页,用于Windows 2000及以后版本 CP_UTF7 //UTF-7,设置此值时lpDefaultChar和lpUsedDefaultChar都必须为NULL CP_UTF8 //UTF-8,设置此值时lpDefaultChar和lpUsedDefaultChar都必须为NULL 用GetLocaleInfo 函数获取当前系统的代码页,936: 简体中文, 950: 繁

UTF8与GBK字符编码之间的相互转换

UTF8与GBK字符编码之间的相互转换 C++ UTF8编码转换CChineseCode 一预备知识 1,字符:字符是抽象的最小文本单位。它没有固定的形状(可能是一个字形),而且没有值。“A”是一个字符,“€”(德国、法国和许多其他欧洲国家通用货币的标志)也是一个字符。“中”“国”这是两个汉字字符。字符仅仅代表一个符号,没有任何实际值的意义。 2,字符集:字符集是字符的集合。例如,汉字字符是中国人最先发明的字符,在中文、日文、韩文和越南文的书写中使用。这也说明了字符和字符集之间的关系,字符组成字符集(iso8859-1,GB2312/GBK,unicode)。 3,代码点:字符集中的每个字符都被分配到一个“代码点”。每个代码点都有一个特定的唯一数值,称为标值。该标量值通常用十六进制表示。 4,代码单元:在每种编码形式中,代码点被映射到一个或多个代码单元。“代码单元”是各个编码方式中的单个单元。代码单元的大小等效于特定编码方式的位数:UTF-8 :UTF-8 中的代码单元由8 位组成;在UTF-8 中,因为代码单元较小的缘故,每个代码点常常被映射到多个代码单元。代码点将被映射到一个、两个、三个或四个代码单元;UTF-16 :UTF-16 中的代码单元由16 位组成;UTF-16 的代码单元大小是8 位代码单元的两倍。所以,标量值小于 U+10000 的代码点被编码到单个代码单元中;UTF-32:UTF-32 中的代码单元由32 位组成;UTF-32 中使用的32 位代码单元足够大,每个代码点都可编码为单个代码单元;GB18030:GB18030 中的代码单元由8 位组成;在GB18030 中,因为代码单元较小的缘故,每个代码点常常被映射到多个代码单元。代码点将被映射到一个、两个或四个代码单元。 5,举例:“中国北京香蕉是个大笨蛋”这是我定义的aka字符集; 各字符对应代码点为: 北00000001 京00000010 香10000001 蕉10000010 是10000100 个10001000 大10010000 笨10100000 蛋11000000 中00000100 国00001000 下面是我定义的zixia 编码方案(8位),可以看到它的编码中表示了aka字符集的所有字符对应的代码单元; 北10000001 京10000010 香00000001 蕉00000010 是00000100 个00001000 大00010000 笨00100000 蛋01000000 中10000100 国10001000 所谓文本文件就是我们按一定编码方式将二进制数据表示为对应的文本如00000001000000100000010000001000000100000010000001000000这样的文件。我用一个支持zixia编码和aka字符集的记事本打开,它就按照编码方案显示为“香蕉是个大笨蛋” 如果我把这些字符按照GBK另存一个文件,那么则肯定不是这个,而是1100111111100011

国家标准信息技术汉字编码字符集基本集-全国信息技术标准化

《信息技术通用编码字符集(基本多文种平面)汉字15×16点阵字型》(征求意见稿)编制说明 一、工作简况 1、任务来源 随着信息技术的不断发展,中文信息技术产品所使用硬件设备得到提升,中文信息处理设备对点阵字型出现了新的需求,为了满足信息处理设备对15×16点阵的需求,国家标准化管理委员会在2015年第三批“制、修订国家标准项目计划”中安排了本标准的制定工作,计划代号为20153659-T-469,标准名称为《信息技术通用编码字符集(基本多文种平面)汉字15×16点阵字型》。 本标准由中国电子技术标准化研究院、北京仓颉博雅信息技术有限公司等单位负责起草,标准主要起草人有代红、熊涛等。 2、主要工作过程 标准计划任务下达后,由中国电子技术标准化研究院牵头成立了标准编制组和专家组,并制定了详细的标准研究实施方案。中国电子技术标准化研究院主要负责字型设计、组织协调和标准文本起草,北京仓颉博雅信息技术有限公司负责字型设计,火箭军装备研究院第四研究所和潍坊北大青鸟华光照排有限公司负责字型纠错修改,专家组负责字型审查工作。 按照标准实施方案的要求,标准编制组于2016年6月底,分批提供了15×16点阵字型的设计初稿,并将字型设计初稿提供给字型专家审查,在设计点阵字型时对有疑问的字进行查证讨论,做到每个字的修改确定有据可查。根据字型专家提出的修改意见,标准编制组对字型设计初稿进行修改,于2017年7月底前完成了对字型设计初稿的修改整理。在对字型设计稿修改的同时,标准编制组还进行了标准文本的起草工作,2017年10月完成了标准草案。2017年11月标准草案提交中国电子技术标准化研究院进行标准专家内审,标准起草组根据标准内审专家提出的意见对草案进行修改,形成了标准的征求意见稿,现向各位征求意见。 3、标准编制的主要成员单位及其所做的工作 本标准由中国电子技术标准化研究院、北京仓颉博雅信息技术有限公司、火箭军装备研究院第四研究所等单位负责起草。中国电子技术标准化研究院主要负责标准文本的起草、标准研究的组织协调,北京仓颉博雅信息技术有限公司负责

常用字符集编码详解:ASCII、GB2312、GBK、GB18030、...

ASCII ASCII 码是7位编码,编码范围是0x00-0x7F ASCII 字符集包括英文字母、 阿拉伯数字和标点符号等字符。其中 0x00-0x20和0x7F 共33个控制字符。 只支持ASCI 码的系统会忽略每个字节的最高位,只认为低 7位是有效位。 HZ 字符编码就是早期为了在只支持 7位ASCII 系统中传输中文而设计的编码。 早期很多邮件系统也只支持ASCII 编码,为了传输中文邮件必须使用 BASE64或 者其他编码方式。 GB2312 GB2312是基于区位码设计的,区位码把编码表分为 94个位,每个字符的区号和位号组合起来就是该汉字的区位 码。 10进制数来表示,如 1601就表示 16区1 位,对应的字符是 区号和位号上分别加上0xA0就得到了 GB2312编 码。 区位码中 01-09区是符号、数字区, 16-87区是汉字区, 未定义的空白区。它将收录的汉字分成两级: 第一级是常用汉字计 3755 个,置于 16-55 区,按汉语拼音字母 /笔形顺序排 列;第二级汉字是次常用汉字计 3008 个,置于 56-87 区,按部首 /笔画顺序排 列。一级汉字是按照拼音排序的,这个就可以得到某个拼音在一级汉字区位中 的范围,很多根据汉字可以得到拼音的程序就是根据这个原理编写的。 GB2312字符集中除常用简体汉字字符外还包括希腊字母、日文平假名及片 假名字母、俄语西里尔字母等字符,未收录繁体中文汉字和一些生僻字。可以 用繁体汉字测试某些系统是不是只支持 GB2312编码。 GB2312的编码范围是0xA1-0x7E 去掉未定义的区域之后可以理解为实际 编码范围是 0xA1-0xF7FE 。 EUC-CN 可以理解为GB2312的别名,和GB2312完全相同。 区位码更应该认为是字符集的定义,定义了所收录的字符和字符位置,而 94个区,每个区对应 区位码一般用 “啊”。在区位码的 10-15和 88-94是

Oracle 导入导出字符集乱码问题

Oracle 导入导出字符集乱码问题 导出/导入与字符集 进行数据的导入导出时,我们要注意关于字符集的问题。在EXP/IMP过程中我们需要注意四个字符集的参数:导出端的客户端字符集,导出端数据库字符集,导入端的客户端字符集,导入端数据库字符集。 我们首先需要查看这四个字符集参数。 查看数据库的字符集的信息: SQL> select * from nls_database_parameters; PARAMETER VALUE ------------------------------ -------------------------------------------------------------------------------- NLS_LANGUAGE AMERICAN NLS_TERRITORY AMERICA NLS_CURRENCY $ NLS_ISO_CURRENCY AMERICA NLS_NUMERIC_CHARACTERS ., NLS_CHARACTERSET ZHS16GBK NLS_CALENDAR GREGORIAN NLS_DATE_FORMAT DD-MON-RR NLS_DATE_LANGUAGE AMERICAN NLS_SORT BINARY NLS_TIME_FORMAT HH.MI.SSXFF AM NLS_TIMESTAMP_FORMAT DD-MON-RR HH.MI.SSXFF AM NLS_TIME_TZ_FORMAT HH.MI.SSXFF AM TZH:TZM

NLS_TIMESTAMP_TZ_FORMAT DD-MON-RR HH.MI.SSXFF AM TZH:TZM NLS_DUAL_CURRENCY $ NLS_COMP BINARY NLS_NCHAR_CHARACTERSET ZHS16GBK NLS_RDBMS_VERSION 8.1.7.4.1 NLS_CHARACTERSET:ZHS16GBK是当前数据库的字符集。 我的windows oracle编码为: NLS_NCHAR_CHARACTERSET AL16UTF16 NLS_CHARACTERSET ZHS16GBK 我们再来查看客户端的字符集信息: 客户端字符集的参数NLS_LANG=_< territory >. language:指定oracle消息使用的语言,日期中日和月的显示。 Territory:指定货币和数字的格式,地区和计算星期及日期的习惯。 Characterset:控制客户端应用程序使用的字符集。通常设置或等于客户端的代码页。或者对于unicode应用设为UTF8。 在windows中,查询和修改NLS_LANG可在注册表中进行: HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\HOMExx\ xx指存在多个Oracle_HOME时的系统编号。 我这里的windows默认为: windows Client: NLS_LANG SIMPLIFIED CHINESE_CHINA.ZHS16GBK 在Linux redhat5中:

中文字符集、编码

前言
由于工作的需要,参考了好多资料整理出来一份计算机汉字处理报告,不敢独享,希 望与大家共享。Ziggler 现代计算机技术虽然先进, 但大多数人只知录入 GB-2313 字符集内的 6763 个简体汉字, 对包含 21003 个简繁体汉字的 GBK 字符集的文字录入、字体 显示就已不甚了解(市面上 绝大多数所谓的繁体字体,其实采用的是 GB2313 字符集简体字的编码,用字体显示为繁体 字,而不是直接用 GBK 字符集中繁体字 的编码,错误百出) 。而汉字总数至少有近 10 万 个,目前计算机能处理的,也有 70244 个,已非一般人所能知能用了。 由于汉字总数非常庞大。 汉字总共有多少字?到目前为止, 恐怕没人能够答得上来精确 的数字。据估计,汉字数量达到 11 万左右。 这里所说的七万多汉字, 是指 UNICODE 超大字集全部七万多中日韩汉字。 (注: Unicode 是指用两个字节表示每个字符的字符编码方案。 ) 那一般计算机能够显示多少个汉字呢?比如大陆这边普遍安装简体 Windows 系统,而 简体 windows 以宋体为系统字型,宋体支持 GBK 编码,所以能显示 20902 个汉字。 要显示 71564 个汉字, 可以采取多种方案, 如: 宋体-方正超大字符集+新细明体 EXTB、 宋体-方正超大字符集+中易宋体 EXTB、宋体 GB18030+新细明体 ExtB、宋体 18030+宋体 ExtB 等等。
中文字符集、编码
字符是各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等。字符 集是多个字符的集合,字符集 种类较多,每个字符集包含的字符个数不同。 计算机要准确的处理各种字符集文字, 需要进行字符编码, 以便计算机能够识别和存储 各种文字。 中文文字数目大, 而且还分为简体中文和繁体中文两种不同书写规则的文字, 而计算机 最初是按英语单字节字符设计的, 因此, 对中文字符进行编码, 是中文信息交流的技术基础。 以下是常见的一些字符集介绍,部分字符集中包括编码介绍。
GB2312 字符集
1.名称的由来 GB2312 又称为 GB2312-80 字符集,全称为《信息交换用汉字编码字符集·基本集》 ,由原中 国国家标准总局发布,1981 年 5 月 1 日实施。 2.特点 GB2312 是中国国家标准的简体中文字符集。它所收录的汉字已经覆盖 99.75%的使用频率,

相关文档
最新文档