十二 国际化和中文编码问题
国际化编码规则

国际化编码规则介绍国际化编码规则是指在跨国交流中统一使用的字符编码规则。
随着全球化进程的加速,不同国家和地区的人们需要进行更加频繁的交流合作,因此使用统一的国际化编码规则变得尤为重要。
本文将从国际化编码规则的背景、作用、常见规则和应用等方面进行全面详细地探讨。
背景在信息时代,人们越来越离不开数字设备和网络,而这些设备和网络都是以二进制编码进行信息传输的。
但是不同国家和地区有不同的字符集和字符编码方式,导致在信息交流中出现了很多问题。
为了解决这些问题,国际化编码规则应运而生。
作用国际化编码规则的主要作用是实现全球范围内的字符编码统一,确保不同地区的人们能够顺畅地进行信息交流。
具体来说,国际化编码规则有以下几个方面的作用:字符兼容性不同国家和地区使用的字符集有所不同,国际化编码规则可以实现字符的兼容性,使得不同字符集之间的转换更加方便。
编码统一国际化编码规则统一了跨国交流中所使用的字符编码,这样就能够避免因为编码不统一而导致的乱码问题。
文化传播国际化编码规则的实施不仅仅是技术问题,更涉及到不同国家和地区的文化传播。
通过统一的字符编码规则,可以更好地传播和交流不同地区的文化。
常见规则国际化编码规则有很多种,下面列举几种常见的规则:UTF-8UTF-8是一种变长的字符编码方式,它能够兼容ASCII码,可以表示世界上几乎所有的字符。
UTF-8使用1到4个字节来表示一个字符,能够有效地节省存储空间。
UTF-16UTF-16也是一种变长的字符编码方式,它使用2或4个字节来表示一个字符。
UTF-16最大的特点是使用两个字节来表示常见的字符,而使用四个字节来表示罕见的字符,这样使得对于常见字符的存储和处理更加高效。
GBKGBK是中国国家标准的字符集和编码方式,它是在GB2312的基础上进行了扩展。
GBK能够表示简体中文和繁体中文等字符,是一种常用的字符编码规则。
ISO-8859-1ISO-8859-1是国际标准化组织制定的字符编码规则,它使用一个字节来表示一个字符。
中文化和国际化问题权威解析之一 字符编码发展历程

中文化和国际化问题权威解析之一字符编码发展历程前几天看文初的《精武门之Web安全研讨会首日感受》,说到利用字符集攻击时提到以前宝宝写的一篇有关国际化的文章,趁机再次拜读了宝宝的这篇大作,不得不感慨宝宝的写作功底,无敌!这么好的文章不分享出来实在是太可惜了,在此将宝宝的大作转帖于此;作者序在我开发Java程序的几年中,遇到得最多,也是别人向我提问最多的问题,就是各种各样看似稀奇古怪的中文乱码问题了。
网上也有许多解释和解决Java中文问题的文章,但水平参差不齐,有一些文章甚至是错误的。
此外,我们公司自己的Java程序从一开始就采用了错误的方式处理中文问题,虽能解一时之急,却引出了越来越多的深远的问题。
每当我听到有的同事还在讨论如何特殊处理双字节的中文GB码,就感慨他们思路的狭隘。
试问,今天我们可以用特殊的方式处理我们所熟悉的中文编码,可是今后我们怎样才能应付日文版、韩文版、或世界其它国家语言的产品开发呢?在我看来,与其说这些问题是"中文化问题",不如说是"国际化问题"。
所谓的"汉化"这种说法已经随时代远去了。
想想看,这个词带有明显的小农经济的色彩:自家汉化自家用,哪管世界变化多。
经过汉化的软件,常常意味着:版本落后、不兼容、不稳定。
为什么会这样呢?根本原因是,从软件的设计阶段,就没有考虑国际用户的需要,没有采用国际通用的标准。
事后要弥补自然难上加难。
所以让我们把眼光放开,想一想"国际化"。
当然国际化的目的还是生产出"汉化"的软件,但我们可以用同样的方法"韩化"、"日化"、"阿拉伯化",统称为"本地化"--这就是"国际化"的目的。
国际化和本地化有两个很体面的英文缩写:I18n(Internationalization)和L10n(Localization)。
J2ee应用中文乱码问题解决方案

<%@ page import=".URLEncoder"%>
<a href="modifyGroupAction.do?groupId=<%=URLEncoder.encode(g.getId(), "UTF-8")%>"> 显示为 <a href="modifyGroupAction.do?groupId=%E5%B7%A5%E7%A8%8B%E9%83%A8"> 但若凑巧整个参数在提交过程中参数长短刚好不会被抛弃一部分 , 刚才提到的二次编码不需要 进行也可以顺利完成整个过程。因为整个过程都是 utf-8 编码的。
所以只是一种比较好的解决方式。
3. 编程涉及地方说明
值得一提的是,因为考虑到程序中处理的信息大多是西文信息,因此有些 WEB 容器(如: Tomcat4.x) 在处理所接收到的 request 字符串时, 如果您没指定 request 的编码方式则系统就 缺省地采用 ISO-8859-1,明白这一点对理解后面的问题会有帮助。 另外若数据库等使用 ISO-8859-1 好多时候也是可以实现一些中文, 原因我上面已经阐述了 一下。
这种方式下, 只要搞清楚取的时候是什么编码, 存的时候是什么编码, 就没有问题的。另外, 别忘了 java 系统和 JDBC 驱动本身会帮助我们进行编码转换, 而且不同的数据库驱动会返回 不同的编码的内容。具体转换就不再这里赘述了, 有兴趣的同事可以相互交流。
下面就公司几个项目实施中提取一些反复实践或推论出的东西, 和大家一起分享和研究。
Tomcat 默认总是使用 ISO-8859-1, 这就是说你用 GBK 编码的中文传到 tomcat 中, 在 servlet 里默认输出 System.out.println()总会得到乱码。 容器参数接收
中文编码解析问题

中文编码解析问题摘要:一、引言二、中文编码的基本概念1.汉字编码2.字符编码3.编码标准三、常见的中文编码问题及解决方法1.乱码问题2.显示问题3.输入问题四、实用编码技巧与建议1.文本处理软件的使用2.网页编码设置3.跨平台交流注意事项五、总结正文:一、引言随着互联网的普及和信息技术的发展,中文编码问题在日常工作和生活中愈发显现。
许多人在使用电脑、手机等设备时,会遇到中文显示不正常、输入困难等问题。
本文将详细介绍中文编码的基本概念,分析常见的中文编码问题,并提供解决方法和建议。
二、中文编码的基本概念1.汉字编码汉字编码是将汉字转换为计算机可以识别和处理的二进制数据的过程。
常见的汉字编码有GBK、GB18030、UTF-8等。
2.字符编码字符编码是用来表示文本中字符的一种编码方式。
常见的字符编码有ASCII、Unicode等。
3.编码标准编码标准是规定字符编码的一种国际标准。
目前常用的编码标准有ISO/IEC 10646、GB 18030等。
三、常见的中文编码问题及解决方法1.乱码问题乱码问题通常是由于使用不同编码标准的文本相互转换导致的。
解决方法是确保文本采用统一的编码标准,并在转换时选择正确的编码格式。
2.显示问题显示问题主要是由于操作系统、浏览器或其他软件默认编码设置与实际文本编码不匹配造成的。
解决方法是调整相关软件的编码设置,使之与文本编码相匹配。
3.输入问题输入问题包括输入法选择错误、输入法版本不兼容等。
解决方法是选择正确的输入法、更新输入法版本等。
四、实用编码技巧与建议1.文本处理软件的使用在使用文本处理软件时,应注意以下几点:(1)保存文档时,选择正确的编码格式。
(2)在跨平台交流时,尽量使用通用的编码标准,如UTF-8。
2.网页编码设置在制作网页时,需要在HTML文件的`<head>`部分指定字符编码,如下所示:```<meta charset="UTF-8">```3.跨平台交流注意事项在进行跨平台交流时,应注意以下几点:(1)确保双方采用相同的编码标准。
推荐Java:国际化编码解决

背景:在做Java开发的时候,常常会出现一些乱码,或者无法正确识别或读取的文件,比如常见的validator验证用的消息资源(properties)文件就需要进行Unicode重新编码。
原因是java默认的编码方式为Unicode,而我们的计算机系统编码常常是GBK等编码。
需要将系统的编码转换为java正确识别的编码问题就解决了。
1、native2ascii简介:native2ascii是sun java sdk提供的一个工具。
用来将别的文本类文件(比如*.txt,*.ini,*.properties,*.java等等)编码转为Unicode编码。
为什么要进行转码,原因在于程序的国际化。
Unicode编码的定义:Unicode(统一码、万国码、单一码)是一种在计算机上使用的字符编码。
它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。
1990年开始研发,1994年正式公布。
随着计算机工作能力的增强,Unicode也在面世以来的十多年里得到普及。
(声明:Unicode编码定义来自互联网)。
2、获取native2ascii:安装了jdk后,假如你是在windows上安装,那么在jdk的安装目录下,会有一个bin目录,其中native2ascii.exe正是。
3、native2ascii的命令行的命名格式:native2ascii -[options] [inputfile [outputfile]]说明:-[options]:表示命令开关,有两个选项可供选择-reverse:将Unicode编码转为本地或者指定编码,不指定编码情况下,将转为本地编码。
-encoding encoding_name:转换为指定编码,encoding_name为编码名称。
[inputfile [outputfile]]inputfile:表示输入文件全名。
outputfile:输出文件名。
国际化编码规则

国际化编码规则随着全球化的进程,各个国家、地区之间的交流合作越来越频繁。
而不同的语言和文化差异也给跨国交流带来了一些困难。
为了解决这些问题,国际化编码规则被广泛应用于交流、存储和处理各种类型的文本数据。
本文将主要介绍国际化编码规则中的中文部分。
国际化编码规则(Internationalization Encoding Rules,IER)是一种将文本转换为计算机可以处理的二进制数据的规则。
它使用特定的编码方式将字符映射成数字,以便计算机能够识别和处理文本数据。
由于不同的字符集和编码方式可能会影响文本数据在不同平台上的显示和传输,因此国际化编码规则被广泛应用于各种领域,如互联网、软件开发、电子商务等。
二、中文编码方式中文编码方式指将中文字符转换为计算机可以处理的二进制数据的方式。
一般来说,中文字符可以用两种方式进行编码:GBK/GB2312和UTF-8。
1. GBK/GB2312编码GBK/GB2312编码是一种将汉字、汉语拼音和拉丁字符等转换为二进制数据的编码方式。
它是国家标准GB2312的扩展编码,支持包括简体字、繁体字和香港/澳门字符在内的几乎所有中文字符。
GBK的编码表由国家标准出版社发布,其字符个数为21886个。
2. UTF-8编码UTF-8编码是一种将Unicode字符集中的中文字符、拉丁字符和其他字符转换为二进制数据的编码方式。
它是一种可变长编码方式,其编码框架为1至4个字节,可以表示Unicode字符集中的任意字符。
相比于GBK/GB2312编码,UTF-8编码的覆盖范围更广,可处理全球范围内的几乎所有字符集,其字符个数高达1112064个。
中文编码规则指在进行文本数据的处理和存储时,所采用的对应的编码方式和相关规则。
在处理中文文本数据时,常常需要注意以下一些规则:1. 编码表选择在进行中文编码时,应该根据编码表的特点和所要处理的中文文本的情况,选择合适的编码方式和编码表。
如果是处理简体中文,可以采用GB2312或GBK编码;如果是需要处理繁体中文,就需要使用Big5编码;如果需要支持全球范围内的字符集,就应该使用UTF-8编码。
文字编码介绍

公元: 2004年9月14日 星期二 5:19下午首页Java编程C&C++数据库游戏经验交流更您的位置:首页->Java->汉字编码问题汉字编码问题一、GB2312-80介绍GB2312码是中华人民共和国国家汉字信息交换用编码,全称《信息交换用汉字编码字符集--基本集》,由国家标准总局发布施,通行于大陆。
新加坡等地也使用此编码。
GB2312收录简化汉字及符号、字母、日文假名等共7445个图形字符,其中汉字占6763个。
GB2312规定“对任意一个图形字符都示,每个字节均采用七位编码表示”,习惯上称第一个字节为“高字节”,第二个字节为“低字节”。
GB2312-80包含了大部汉字,和9区的符号。
该字符集是几乎所有的中文系统和国际化的软件都支持的中文字符集,这也是最基本的中文字符集。
其0xa1-0xfe,低位也是0xa1-0xfe;汉字从0xb0a1开始,结束于0xf7fe。
GB2312将代码表分为94个区,对应第一字节(0xa1-0xfe);每个区94个位(0xa1-0xfe),对应第二字节,两个字节的值分别加32(2OH),因此也称为区位码。
01-09区为符号、数字区,16-87区为汉字区(0xb0-0xf7),10-15区、88-94区是有待进一区。
GB2312将收录的汉字分成两级:第一级是常用汉字计3755个,置于16-55区,按汉语拼音字母/笔形顺序排列;第二级汉字3008个,置于56-87区,按部首/笔画顺序排列。
故而GB2312最多能表示6763个汉字。
GB2312的编码范围为2121H-777EH,与ASCII有重叠,通行方法是将GB码两个字节的最高位置1以示区别。
图1:GB2312编码图图中位于ASCII区中的虚线区域即为原GB2312编码区域,右下角实线区域为平移后的GB2312编码区域。
二、GB2312-80的扩展GBK是GB2312-80的扩展,是向上兼容的。
深入分析JavaWeb中的中文编码问题

深⼊分析JavaWeb中的中⽂编码问题要对Java Web项⽬进⾏编码原因:1、在计算机中存储信息的最⼩单位是1个字节,即8个bit,所以能表⽰的字符范围是0~255个。
2、电脑需要表⽰的符号太多、⽆法⽤1个字节完全表⽰。
要解决这个问题,必须要有⼀个新的数据结构char,⽽从bit到char就要进⾏编码。
常见的编码格式:1、ASCII码总共128个,⽤1个字符的低7位表⽰,0~31是控制字符,如换⾏、回车、删除等。
32~126是打印字符,可以通过键盘输⼊并且表⽰出来2、ISO-8859-1ISO组织在ASCII的基础上⼜制定了⼀系列标准来就、扩展ASCII编码,他们是ISO-8859-1和ISO-8859-15。
其中前者涵盖了⼤多数西欧语⾔字符,所以运⽤得⽐较⼴泛。
ISO-8859-1仍然是单字节编码,它总共能表⽰256个字符.因为ISO-8859-1是单字节的,所以很多中⽂字符(两个字节)在编码时⽤ISO-8859-1表⽰时,因超出表⽰范围,所以出现??很多情况是将中⽂字符⽤ISO-8859-1表⽰。
我们称之为“⿊洞”(它会将不认识的字符吸收掉)。
由于现在⼤部分基础的Java框架或系统默认的字符集编码都是ISO-8859-1,所以很容易出现乱码问题。
3、GB2312GB2312是双字节编码,总的编码范围是A1-F7,其中A1-A9是符号区,总共有682个符号,B0-F7是汉字区,包含6763个汉字。
4、GBKGBK全称是汉字内码扩展规范,是中国国家技术监督局开发出来扩展GB2312,并加⼊了更多的汉字,它的编码范围是8140~FEFE,能表⽰21003个汉字。
它与GB2312是兼容的。
5、GB18030Gb18030全称是信息技术中⽂编码字符集,是我国的强制标准,它可能是单字节的、双字节或者是四字节编码。
它的编码与GB2312编码兼容。
6、UTF-16ISO试图创建⼀个全新的超语⾔字典,世界上的语⾔都能使⽤这个字典进⾏翻译。
十二国际化和中文编码问题

⼗⼆国际化和中⽂编码问题第⼗⼆章S truts国际化程序和中⽂编码问题第⼀节国际化问题概述⼀、什么是国际化编程1)国际化(Internationalization ):就是设计⼀个应⽤的流程,以使之能够不经过⼯程修改就可以使⽤于各种不同的语⾔和区域场所。
2)本地化(Localization ):通过添加特定场所的组建和翻译⽂本来使软件适⽤于特定的场所和语⾔的过程。
我们花费了⼤量的精⼒来开发⾃⼰的Web应⽤,当然都希望在应⽤的开发上得到更⼤的投资回报。
因为互联⽹连接着世界各地,每个应⽤都可以⾯对国际的受众。
如果某个应⽤可以被本地化,那么它就可以被更多的访问者所访问。
特别是在多语⾔的国家,⽐如⽐利时、加拿⼤、瑞⼠,甚⾄美国尤其重要。
3)本地化那些内容:当⼀个软件产品需要在全球范围应⽤的时候,得考虑在不同的地域和语⾔环境下⾯的使⽤情况(也就是国际化问题),最简单的要求就是UI上的信息上能⽤本地化语⾔来显⽰,这主要包括操作界⾯的风格问题、提⽰和帮助语⾔的版本问题、界⾯定制个性化问题等。
Java语⾔内核基于Unicode2.1提供了对不同国家和不同语⾔⽂字的内部⽀持,由于先天的原因,Java对于国际化的⽀持远远要⽐C/C++来的优越。
Struts的国际化能⼒是它本⾝提供的,但为了更好的理解国际化问题,我们先从Java语⾔国际化本⾝的技术谈起。
⼆、⼏个术语1)i18n(Internationalization):就是internationalization, 国际化,由于⾸字母"i"和末尾字母"n"间有18个字符,所以简称i18n. internationalization指为了使应⽤程序能适应不同的语⾔和地区间的变化⽽不作系统性的变化所采取的设计措施,即:将依赖于语⾔和地区的代码与和语⾔⽆关的代码分离开来的过程。
⼀旦程序完成了这项⼯作,它只需很少的⼯作就可以适⽤于不同语⾔的国家和地区。
汉字国际码概率计算

汉字国际码(也称为汉字国际通行码或汉字国际化编码)是一种用于标识汉字字符的国际化编码系统。
通常情况下,Unicode 是最常用的国际汉字编码系统,它为世界上几乎所有的字符提供了唯一的数字标识符。
Unicode 采用了16位或32位编码,使得每个字符都有一个独一无二的编码点。
要计算汉字国际码的概率,通常需要考虑以下因素:
汉字的总数:汉字国际码的概率取决于考虑的汉字总数。
如果你只考虑基本汉字集合,那么你需要知道这个集合中有多少个字符。
汉字的使用频率:不同的汉字在实际使用中具有不同的频率。
一些汉字使用频率很高,而另一些则很少使用。
你可以参考大型文本语料库或汉字频率表来获取汉字的使用频
率信息。
编码点的分布:Unicode 编码系统中,不同汉字的编码点是连续的,但并不是按照频率排列的。
你需要考虑每个汉字的编码点范围以及它们在范围内的分布情况。
概率计算方法:你可以使用不同的统计方法来计算汉字国际码的概率。
常见的方法包括基于频率的统计、信息熵等。
要进行具体的概率计算,你需要收集汉字的频率数据,并根据选择的统计方法来计算概率分布。
这可能需要使用编程语言和统计工具进行处理。
请注意,汉字国际码的概率分布通常是非均匀的,因为一些汉字比其他汉字更常见。
中文字符编码问题

中⽂字符编码问题为了解决程序对中⽂⽀持不好的问题(如路径不能含中⽂),强制程序内的char*字符串采⽤utf8编码。
编码不统⼀导致的乱码问题因为历史原因,C/C++语⾔中char*字符串可能采⽤各种编码:ASCII, Latin, utf8, GBK...所有⽂本⽂件可⽤的编码,char*字符串都可以采⽤。
图1 VSCode⽀持⼏⼗种⽂本编码如果代码中混⽤两种编码A和B,导致采⽤A编码的char*字符串被⽤B编码解析,得到的字符串就可能出现乱码。
⼀般纯ASCII字符不会发⽣乱码,因为绝⼤部分编码的0-127部分的字符都和ASCII编码兼容。
当我们代码⾥有⾮ASCII字符的编码时,统⼀编码就显得⾮常有必要。
char*编码要求采⽤UTF8⽬前最通⽤的char*编码为utf8编码,utf8编码被Python、Linux等设置为默认编码。
Windows在不同语⾔的版本中,char*的默认编码是当前国家的特定编码,⽐如中⽂版采⽤GBK编码。
Windows内核使⽤的编码为utf16编码的wchar_t*字符串,调⽤Windows API传⼊的char*字符串会被先转换为wchar_t*字符串后再调⽤Unicode版本的API。
GBK编码存在不能表⽰某些字符的问题,utf8可表⽰所有字符。
为了解决编码混乱问题,C++20专门为utf8编码新增了std::u8string和char8_t类型。
很多第三⽅库也⽀持utf8编码(当然还有部分不⽀持)综上后续产品中的⾃有C++代码的char*字符串采⽤utf8编码Windows API只使⽤Unicode版本在遇到不⽀持utf8编码的库时,对其进⾏接⼝封装(编码转换)建议函数的形参添加_u8后缀,以便调⽤者快速确认编码要求字符串的编码设置在定义字符串时,采⽤以下⽅法来指定char*字符串为utf8编码// 在VS2010及之后版本,⽀持设置字符串为UTF8编码#if _MSC_VER >= 1600#pragma execution_character_set("utf-8")#endif// 等同项⽬中所有cpp⽂件包含上述指令// 默认str1为GBK编码字符串,进⾏以上的设置后,str1为utf8编码const char* str1 = "中⽂字符串";// 在VS2015后的版本,只需为字⾯量添加u8前缀即可得到utf8编码的字符串// 但Qt的翻译更新功能不认u8前缀,导致ts⽂件内不包含tr(u8"abc")形式的字符串const char* str2 = u8"中⽂字符串";// Linux系统默认采⽤utf8编码,⽆需做额外⼯作采⽤VS2015及之后版本开发的产品中,建议设置编译选项:/execution-charset:utf-8系统调⽤的处理系统提供的函数命令⾏输出1. 可对 printf / wprintf / std::cout 进⾏封装以便输出utf8字符串2. 直接输出std::wstring// 程序启动时,需要初始化Locale以便输出宽字符setlocale(LC_ALL, "");// 输出std::wstring⾄命令⾏std::wstring wstr = L"中⽂字符串";std::wcout << wstr;printf("%ls", wstr.c_str()); // %hs替代窄字符串,%ls替代宽字符串// printf中%s替代窄字符串,wprintf中%s替代宽字符串⽂件打开1. 采⽤ _wfopen / CreateFileW 等⽅法,传⼊wchar_t字符串表⽰的路径2. 采⽤std::ofstream::open(std::wstring wstr)打开其它系统API请采⽤windows api的Unicode版本,即带W后缀的版本。
Java编码中文问题研究及解决方案

Java编码中文问题研究及解决方案计算机系统应用200.5年第11期Java编码中文问题研究及解决方案ResearchandResolutiononChineseProblemBasedonJava冯金辉朱淼良(杭州浙江大学计算机科学与技术学院310027)摘要:本文首先研究了中文问题产生的根源,然后详细分析了各种编码方式及产生中文问题的原因.接着介绍了系统的各个层次可能产生问题的表现以及原因.最后提出了解决中文问题的原则以及具体的解决方案.关键词:编码解码ISO8859UnicodeUTF一81引言现在Java编程语言已经广泛应用于互联网世界,早在Sun公司开发Java语言的时候,就已经考虑到对非英文字符的支持了.Sun公司公布的Java运行环境(JRE)本身就分英文版和国际版,其中国际版支持非英文字符.然而,因为中文字符集不只一个,而且不同的操作系统对中文字符的支持也不尽相同,所以会有许多和汉字编码处理有关的问题在我们进行应用开发中困扰着我们.有很多关于这些问题的解答,但是很多都只是针对某种特定开发环境或者特定情况的解决方法,在实际的应用过程中,需要使用者去一一尝试,才能够得到正确的解决方案,这就大大降低了使用这些解决方法的效率.本文将从汉字编码常识出发,分析Java中文问题,并提出解决问题的原则,使读者能够明白具体情况下应该如何处理,然后提出一系列的具体解决方案,希望对大家解决这个问题有所帮助.2Java的编码方式Java中的字符数据是16位无符号型数据,它表示Unicode集,而不仅仅是ASCII集.它解决了WWW上很多的程序设计问题,比如说低成本的国际化(Inter—nationa1),然而Java所处理的信息,绝大多数都是英文,对它们来说7位的ACSII码已经足够了,而Unicode 却需要双倍的空间,所以Java的这种兼顾各种语言的做法既浪费了存储资源又降低了效率.而Java编程中中文问题的出现,归根结底是由于在Java的各个不同的编码方式之间进行字符转换的时候出错.因此,了解Java使用的各种编码方式,有助于我们解决Java 78实践经验Prac6calExperience中文问题.在Java中常用的编码方式有1508859—1, Unicode,GB2312,GBK,UTF一8.(1).ISO8859—1ASCII编码方式是单字节内码,它使用了单字节8位中的后7位,而第一位都为O.为了应付越来越多的字符需要,如拉丁字母等,于是在AsCII的基础上扩展了1508859—1编码.1508859—1同样是单字节内码, 当ISO8859—1编码的字节首位为O时,字符可以一一映射到ASCII编码字符集.而当ISO8859—1编码的字节首位为1时,则可以增加128个字符.(2).UnicodeUnicode最初是双字节内码.它的出现是为了让每一个字符有唯一的表示形式.Unicode编码是ISO8859—1的扩展.当Unicode编码的高位字节为O (00000000)时,低位字节等同于ISO8859—1编码.这时候,去除Unicode编码的高位字节,其编码就转化为ISO8859—1编码.这种方式适用于基于ISO8859—1 编码方式的西欧语系环境.(3).GB2312GB2312—80是双字节内码,它是在国内计算机汉字信息技术发展初始阶段制定的,其中包含了大部分常用的一,二级汉字,和9区的符号.该字符集是几乎所有的中文系统和国际化的软件都支持的中文字符集,这也是最基本的中文字符集.其编码范围是高位0xal一0xfe,低位也是0xal一0xfe;汉字从0xb0al开始,结束于Oxf7fe.(4).GBKGBK也是双字节内码,是GB2312—80的扩展,是2005年第11期计算机系统应用向上兼容的.它包含了20902个汉字,其编码范围是0x8140一Oxfefe,剔除高位0x80的字位.其所有字符都可以一对一映射到Unicode2.0,也就是说JA V A实际上提供了对GBK字符集的支持.这是现阶段Win—dows和其它一些中文操作系统的缺省字符集. (5).GB18030—2000(GBK2K)GB1<2K是变长内码,它在GBK的基础上进一步扩展了汉字,增加了藏,蒙等少数民族的字形.GBK2K从根本上解决了字位不够,字形不足的问题.它也是未来的中文国家标准.(6).UTF一8UTF一8是变长内码,它提供了一种简便而向后兼容的方法.它的出现是为了提高效率.当操作的文本基本都是规则的ASCII编码时,使用双字节的Unicode 编码显得效率很低.因此Java字节码内的字符串使用了UTF一8这种中间格式.其与Unicode一一对应的编码格式如下:同.主要可能有以下几种情况.(1).isp文件中中文字符无法正确显示,出现类似于拉丁字母的乱码.(2).isp文件中传输的中文参数无法正确显示,显示为”?”.(3).将中文数据存入数据库之后,再读出显示为“?”o以上这些情况随着环境的不同而变化,相同的程序在不同的环境下有些会出现问题,有些则一切正常.3.2产生中文问题的原因.中文不能正确显示的原因,主要是因为字符在不同的编码之间转换的过程中出错.不管是在JSP还是在Servlet中,我们都是用ServletRequest(或其子类)的方法getParameter(Stringname)来访问请求参数的,这个方法返回的是String,也就是说我们能得到的是已经对Internet传来的字节流解码所得的字符串.如果服务器能对这些字节流进行正确的解码,那将是件完s骂嘶…I一s…一s吣一setBrowser7位的Unicode:0XXXXXXX11位的Unicode:110XXXXX10XXXXXX16位的Unicode:1110XXXX10XXXXXX10XXXXXX21位的Unicode:11110XXX10XXXXXX10XX XXXX1OXXXXX其中X代表的是Unicode的编码,按规则加上”1|’和”O”之后则是UTF一8的编码.除了7位的编码,可以看出,UTF一8编码的第一个字节高位1的数目就代表了该编码的字节数.如21 位的编码首字节高位有4个”1”,其编码也为4字节编码3几种中文问题的情况3.1中文问题的表现形式Java中中文问题的出现,主要是由于中文字符串无法正确显示.由于环境的不同,其出现情况也不相JavaServer美的事.其实说来也很简单,要做到这一点只需要服务器知道这些字节流在客户端是用什么编码进行编码也就行了.数据从容户端到服务器端的方式如图1所示.我们希望其中的encoder与decoder相同,这样在编码解码的过程中就不会出错.可是服务器端并不能知道客户端采用何种方式编码,如果不加设置,它会采用缺省的ISO8859方式解码.如果encoder与decod—er不同,这样就会导致数据出错.编码(Encode)和解码(Decode)是两个相反的动作.编码是把字符按照某种映射标准(字符集),转换成字节,如我们对Unicode字符串”我是中国人”按照GB2312标准编码(bytebsg[]=“我是中国人”.get—Bytes(“GB2312”):),就可以得到一个字节序列(bytes sequence),用十六进制的码值表示:OxCEOxD2OxCAOxC7OxD6OxD0OxB9OxFAOxC8OxCB,按照UTF一8标准编码(bytebsu[]=“我是中国人”.getBytes(“UTF一8”);),就可以得到字节序列:0xE60x880x910xE60x980xAF0xE40xB80xAD0xE50x9B0xBDOxE40xBA0xBA.而解码则是将字节序列按照PracticalExperience实践经验79计算机系统应用2005年第11期某种字符标准(解码,decoding),转换成字符串.如果将以上两个字节序列分别按对应得GB2312和UTF一8得格式解码,都能得到”我是中国人”得字符串.而如果将0xCE0xD20xCA0xC70xD60xD00xB90xFA0xC80xCB得字节序列按照UTF一8得格式解码,将得到错误的结果,即显示为乱码.在以上的过程中,出错主要发生在两个部分,即编码过程或者解码过程.我们采用Unicode做解释.编码过程:Unicode一>Byte,即将字符串按Unicode字符集转换成为Byte字节流.如果目标代码集不存在对应的代码,则得到的结果是0x3f,即”?”,而当字符串是GB2312格式的时候,符号区中的一些符号将被映射到一些公共的符号编码,最终显示为非”?”的一串杂乱字符.解码过程是B’一>Unicode,即将Byte字节流按照Unicode字符集进行解码.如果Byte标识的字符在Unicode源代码集中不存在,则得到的结果是0xfffd.在页面显示的时候,因为0xfffd不存在对应代码,最终也显示为”?”.Java中的中文问题其实就是编码与解码过程中错误的叠加,甚至是多次叠加之后产生的结果.因此,要彻底的解决中文问题,必须处理每一步的错误.另外,Java产品的最初应用都是基于西欧语系,因此,在双字节的Unicode内码转换为ISO8859—1编码时,可能会采取截取低位字节的方式.在英文环境中,这绝对没有问题,但是当文本中有中文存在时,也就产生了错误.从而也会产生中文问题.4解决中文问题的方法搞清楚了中文问题产生的原因,也就相应的有了解决办法.既然中文问题是因为编码转换而产生的,那么我们只要搞清楚数据在各个部分是以什么样的编码方式存在,把不一致的转换过来就可以了.相对而言,Tomcat作为一种免费的软件,它主要是基于英语环境,在某些细节方面处理的还不够完善,因此是产生问题最多的.而resin服务器则具有比较稳定的特性, 对中文的支持也比较好,因此不大会有问题.在数据库系统方面,Oracle和DB2等大型关系数据库在中文数据编码转换方面也处理的比较好,而mysql数据库由于并不支持Unicode的编码方式,因此在数据的写8O实践经验PracticalExperience入与读出过程中也常常会产生中文问题.因此,本文一般讨论的中文问题解决方案,都是基于Tomcat+ mysql的环境.而在其他的环境下,如果有中文问题,按照同样的规则则比较容易解决.4.1在isp网页中定义输出字符集大多数的浏览器都是采用UTF一8编码方式传输信息,当isp页面中固定的中文字符无法正确显示时,可以将输出字符集设置为”GB2312”.采用如下方式: 在页面的开头加入<%@pagecontentType=“text/ htmI:charset=gb2312”%>或者加入meta信息< METAHTrP—EQUIV=“Content—type”CONTENT=“text/html:charset=GB2312”>.这样在页面输出的时候,就可以采用GB2312的字符集,从而正确显示中文.4.2网页间中文参数的传输.Java在网络传输中使用的编码是”IS08859—1t’,所以针对特定的输出字符集需要对中文参数进行转换.在这里,有一个原则就是要让中文参数的编码与输出字符集一致.即当按照4.1的方式定义了输出字符集为中文时,在使用get和post方法时需要进行转换.publicStringge~tr(Stringstr){try{Stringtemp_p=str;byte[]temp_t=temp—P.getBytes(“ISO8859—1”);Stringtemp=newString(temp—t,“gb2312”);returntemp;}catch(Exceptione){}return”NULL”;}publicStringsetStr(Stringstr){try{Stringtemp_p=str;byte[]temp—t=temp—P.getBytes(“gb2312”);Stringtemp=newString(temp_t,”ISO8859—1”);retumtemp;2005年第11期计算机系统应用fcatch(Exceptione){}return”NULL”;}getStr的作用是将接收的ISO8859—1编码的参数转换为gb2312编码.5elStr方法的作用与getStr相反,是将gb2312编码的参数转换为1508859—1传输出去,.selStr和getStr的使用主要是弥补编码自动转换的不足.这两个方法使用情况如下所示:(1)当Form采用post的方式发送参数时叵一IS08859,~-图2setStr的使用如果页面的输出字符集设置为GB时,参数传递时会自动将GB格式的编码转化为1508859—1发送, 否则,当使用缺省字符集ISO8859—1时(如图2),其中的中文参数则需要通过selStr方式手工转换为ISO8859—1编码.‘(2)当Form采用get的方式获取中文参数时图3getStr的使用如果使用的是缺省字符集,则不需要进行字符转换.而当页面的输出字符集为GB时,则需要使用get—Str的方法将IS08859编码转换为GB编码.由以上可以看出,selStr和ge~tr方法的使用,都是为了保证数据流在网页间传递的过程中保持编码的一致性.最重要的就是做到在发送前将字符正确转换为IS08859格式,而在页面中,则保持变量字符编码与输出字符集的一致.而这一原则也同样适用与页面与数据库之间的数据交互.4.3获取中文参数时定义解码方式.在如上图4.2的方式中,中文参数数量较少的情况可以那样处理.然而,当Form格式中传递较多的参数时,需要对每一个参数都使用ge~tr的方式进行转换,这样就显得代码较乱而且降低效率,因此,可以在获取参数前,可以使用过滤器来设置请求实体得编码方式.如下:request.setCharacterEncoding(“gb2312”);并且设置响应实体得解码方式,如下:response.setContentType(“text/html;charset=gb2312”):4.4在编译Sewlet和JSP时加入代码选项在编译Servlet时使用Java—encodingISO8859—1.iava.在JSP的ZONE配置文件中,修改编译参数为:Compiler=builtin—iavac—encodingISO8859—1.使用这种方法后,数据流都以ISO8859的编码方式存在,不需要再进行代码转换,因此可以正常显示中文. 4.5有关数据库中文问题的处理(1)设置数据库Encoding一般的关系数据库都支持数据库Encoding,在创建数据库时选用合适的编码方式,如GB2312,GBK,UTF一8,这样数据库中的数据就以设置的编码方式存储. 在数据的出口和入口都能自动进行数据转换,可以保证数据的正确性.而ISO8859的编码方式将会增加编码的复杂度,因此不建议使用.另外,选用数据库可以选用Oracle,DB2等大型数据库,mysql数据库由于不支持Unicode编码方式,并且在数据出入口的自动换码方面有所欠缺,因此也不推荐使用.(2)通过转换函数实现JDBCDriver的字符转换目前大多数JDBCDriver采用本地编码格式来传输中文字符,例如中文字符”0x4175”会被转成”0x41”和”0x75”进行传输.因此,向数据库中插入数据时,需要先将Unicode转成Nativecode,当从数据库中查询数据时,则需要将Nativecode转换成Unicode.但这种方式将使代码变得复杂并且难以移植,因此并非较好的方法.以上五种基本的解决方案,其中的1,3,4,5都是比较规范性的方法,因此处理比较简单.并且也不具有较大的针对性,较为通用.然而也正因为此,不能有效的解决所有问题,方案2,具有较大的针对性以及灵活性,可以自由的使用在需要的地方.也是最常用的一种方法.(下转第66页)PracticalExperience实践经验81计算机系统应用2005年第11期约束条件下的响应时间数据分布有一定差异,响应时间在lOs内的执行次数比曲线很平缓,表示有较多次仿真执行都以中断结束,说明设计模型的接电话相关模块的设计或约束设置上不太合理.嘲瘟弼i亏I采啦穗陂鼍走囊小僖姥图3iCDMdt环境中普通电话机实例的设置及性能分析图5小结在我们研制开发的iCDMdt环境中,其性能分析工(上接第81页)5总结Java编程语言应用于网络,这就要求Java对多国字符有很好的支持.Java编程语言适应了计算的网络化的需求,为它能够在网络世界迅速成长奠定了坚实的基础.Java的缔造者(JavaSoft)已经考虑到Java编程语言对多国字符的支持,只是现在的解决方案有很多缺陷在里面,需要我们付诸一些补偿性的措施.而在目前我们所考虑的解决方案更多的应该是具有普遍性的,而不是仅仅针对与某一些特定的运行环境.实际的处理过程中,遵循使字符串编码方式与当前页面解码方式一致的原则,针对应用环境处理双字节字符编码转换时的遗漏进行补救,从而可以解决各种不同环境下的中文问题.当然,这也导致了一个结果,当66应用技术ApedT~:hnicLue具成为软硬件划分和进一步优化的关键.本文在简单介绍了继承的软硬件协同环境iCDMdt后,详细叙述了性能分析工具及其实现,并以普通电话机为设计实例, 应用iCDMdt环境得到直观明了的性能分析图形.这一实例的实际执行证明了设计者不仅能在同一环境中完成设计,模拟,测试,分析全过程,而且能得到清晰直观的分析结果,从而大大提高了设计效率.参考文献1何强,何英,Matlab扩展编程(M),北京清华大学出版社,2002.2尚涛,石端伟,安宁,张李义,工程计算可视化与MATB实现(M),武汉大学出版社,2002.3刘志俭,潘献飞,连军想,~TLAB外部程序接口(6.X)(M),北京科学出版社,2002.4栾静,吕钊,顾君忠,中德软硬件协同设计合作研究项目研制报告(R),华东师范大学应用研究所,20o4,12.5徐明,夏新军,陈吉华,SoC设计中一种软硬件划分的性能评价方法,计算机工程,2004.11.6SystemC.FundionafSpecificationForSystemC2.0. [EB/OL],2001.运行环境有所改变,那么程序又可能出现新的问题.而世界标准化组织也在努力把人类所有的文字统一在一种编码之中,其中一种方案是15010646,它用四个字节来表示一个字符,也许等到那一天,程序员就不需要再为编码问题而烦恼.参考文献1JuStinCouch.Java2EnterpriseEditionBible.Wiley Publishing.fnc.2001.2段明辉,Java编程技术中汉字问题的分析及解决, http://w~A,v一/developerWorks/cn/iava/iavachinese/index.shfmf.2000—11一o8.3http://VV,/4whodsow,J2EEWeb组件中中文及相关的问题,hf—tp:///develop/article/21/21760.shtm. 一—碧赫牯。
中文编码规则

中文编码规则
中文编码规则是涉及计算机处理和传输汉字的重要技术。
以下是几种常见的中文编码规则:
1. GB2312编码:GB2312简体中文编码,一个汉字占用2个字节,在大陆是主要的编码方式。
当文章/网页中包含繁体中文、日文、韩文等时,这些内容可能无法被正确编码。
范围:高字节从A1-A7,低字节从A1到FE。
将高字节和低字节分别加上0xA0即可得到编码。
2. GBK编码:GBK编码是GB2312的扩展,支持更多的汉字字符。
它也是一个双字节编码方案,兼容GB2312编码。
3. GB18030编码:GB18030是中国制定的一个中文编码标准,旨在覆盖更多的汉字和其他字符。
它也是一个双字节编码方案,但支持的字符数量比GBK更多。
4. Big5编码:Big5是繁体中文的常用编码方式,使用两个字节表示一个汉字字符。
它主要在台湾和香港地区使用。
5. Unicode编码:Unicode是一种国际化的编码标准,旨在将世界上所有的字符纳入一个统一的编码系统。
它使用一个或多个16位的码位来表示一个字符。
对于汉字,Unicode标准将常用的汉字字符纳入基本多语言平面,每个汉字使用两个16位的码位来表示。
以上是中文编码规则的介绍,了解这些规则有助于更好地在计算机中处理和传输中文字符。
中文编码问题

中⽂编码问题1,了解为什么java内存编码⽤utf-16,⽹络传输⽤utf-82,java web的编码问题URL httpHeader POST表单 HttpBodyJS编码其他编码3,常见问题分析中⽂编程看不懂字符⼀个汉字变成⼀个问号⼀个汉字变成两个问号⼀、为什么要编码?计算机储存信息的最⼩单元是1个字节,能表⽰的字符范围是0-255我们要表⽰的字符号太多,1个字节远远不够,因此要有⼀个新的类型char,从char到byte必须编码。
⼆、常见编码格式有哪些?1,ASCII码⽤⼀个字节的低7位表⽰,00-7F(即0-127)范围,0-31是回车、换⾏、删除等控制字符,32-126是打印字符,可以⽤键盘输⼊并显⽰出来。
2,ISO-8856-1ASCII码共128个字符是远远不够的,ISO组织⼜制定了这个标准。
以单字节表⽰,共256个字符。
对于英⽂字符是⾜够了。
3,GB2312中⽂全称为 “信息交换⽤汉字编码字符集” ,双字节的。
GB2312 共收录有 7445 个字符,其中简化汉字 6763 个,字母和符号 682 个4,GBK全称“汉字内码扩展规范”,为了扩展GB2312,故兼容GB2312,能表⽰21003个汉字。
5,GB18030是我国强制标准,但实际应⽤系统并不多。
6,UTF-16Unicode,是ISO视图创建⼀个全新的超语⾔字典,可以互相翻译全世界所有语⾔。
UTF-16定义了Unicode在计算机的存取⽅法,⽤两个字节表⽰Unicode的转化格式,两个字节是16位,故叫UTF-16。
UTF-16表⽰字符很⽅便,简化了字符串操作,因此Java以UTF-16作为内存的字符存储格式。
7,UTF-8UTF-16统⼀⽤量个字节表⽰⼀个字符,虽然表⽰很简单⽅便,但缺点是很⼤⼀部分字符可以⽤⼀个字节表⽰,缺占了两个字节,存储空间上放⼤了⼀倍。
在⽹络带宽有限的情况下,增⼤⽹络流量。
UTF-8采⽤变长技术,不同类型的字符可以由1-6个字节组成。
编写R源代码时中文编码问题简介

编写R源代码时中文编码问题简介上个星期做第一次R作业,看到坛子上有人问中文乱码相关的一些问题。
做完作业后,想在这里总结一下,和大家分享。
(一)中文问题的由来各个国家的文字往往都有差别,西方主要是使用拉丁字符系列,而东方则以汉字为代表,使用象形或会意文字。
由于早期的计算机在西方使用较多,所以支持的文字以拉丁语系为主,这种编码体系在国际上有一个标准,就是ISO-8859系列,特点是仅支持拉丁语系的字符,我们国家的汉字是不在这个系列之中的。
虽然ISO-8859不包含中文编码,但它在计算机中处理的速度也是最快的,这使得很多西方人开发的软件都采用这种编码,这使得我们中国人在使用时就有可能会遇到中文乱码问题。
(二)我国的汉字编码标准实际上,随着计算机的普及,很多国家也都制定了和本国文字相关的一些计算机标准,我们国家的几个标准罗列如下:、•GB2312这里的GB代表“国标”的首字母拼音简写,这是我国早期制定的用于计算机中汉字处理和存储的标准,里面包含了6000多常用汉字的编码规定,不过繁体和一些难检字在这个标准里面没有包含进来,比如著名的前总理名字中的那个“镕”字就没有。
•GBK是GB2312的扩充,实际上就是“国标扩”的拼音首字母缩写。
它包括了繁体和大部分难检字,中文Windows2000、XP等都使用了这个标准做为系统文本存储的默认编码。
•GB18030这是在GBK基础上进一步的扩充的标准,包含了中、日、韩等多国文字编码规则(简称CJK编码,CJK即Chinese、Japanese、Korean),当然也包含我国少数民族如蒙、回等文字。
的GB18030标准在2005年发布。
我们国家其他地区由于历史的原因也有一些独立的编码体系,比如台湾的Big5码和香港的HK码,他们和GB系列的不同,主要用于繁体汉字。
(三)国际编码标准针对不同国家的文字编码问题,计算机界在国际上的支持主要通过Unicode系列编码进行支持,这个编码本身的意思就是“统一码”。
[VIP专享]深入分析 Java 中的中文编码问题
![[VIP专享]深入分析 Java 中的中文编码问题](https://img.taocdn.com/s3/m/25fb6b94e87101f69f319557.png)
学过计算机的人都知道 ASCII 码,总共有 128 个,用一个字节的低 7 位表示,0~31 是控制字符如换行回车删除等; 32~126 是打印字符,可以通过键盘输入并且能够显示出来。
ISO-8859-1
128 个字符显然是不够用的,于是 ISO 组织在 ASCII 码基础上又制定了一些列标准用来扩展 ASCII 编码,它们是 ISO-8859-1~ISO-8859-15,其中 ISO-8859-1 涵盖了大多数西欧语言字符,所有应用的最广泛。ISO-8859-1 仍然是单字节编码,
几种常见的编码格式
为什么要编码
不知道大家有没有想过一个问题,那就是为什么要编码?我们能不能不编码?要回答这个问题必须要回到计算机是如 何表示我们人类能够理解的符号的,这些符号也就是我们人类使用的语言。由于人类的语言有太多,因而表示这些语言的符 号太多,无法用计算机中一个基本的存储单元—— byte 来表示,因而必须要经过拆分或一些翻译工作,才能让计算机能理解。 我们可以把计算机能够理解的语言假定为英语,其它语言要能够在计算机中使用必须经过一次翻译,把它翻译成英语。这个 翻译的过程就是编码。所以可以想象只要不是说英语的国家要能够使用计算机就必须要经过编码。这看起来有些霸道,但是 这就是现状,这也和我们国家现在在大力推广汉语一样,希望其它国家都会说汉语,以后其它的语言都翻译成汉语,我们可 以把计算机中存储信息的最小单位改成汉字,这样我们就不存在编码问题了。
深入分析 Java 中的中文编码问题
作者:许令波 , 发布于 2011-07-27 , IBM
简介: 编码问题一直困扰着开发人员,尤其在 Java 中更加明显,因为 Java 是跨平台语言,不同平台之间编码之间 的切换较多。本文将向你详细介绍 Java 中编码问题出现的根本原因,你将了解到:Java 中经常遇到的几种编码格式的区别; Java 中经常需要编码的场景;出现中文问题的原因分析;在开发 Java web 程序时可能会存在编码的几个地方,一个 HTTP 请求怎么控制编码格式?如何避免出现中文问题?
编码问题——精选推荐

编码问题⼀什么是编码?基本概念很简单。
⾸先,我们从⼀段信息即消息说起,消息以⼈类可以理解、易懂的表⽰存在。
我打算将这种表⽰称为“明⽂”(plain text)。
对于说英语的⼈,纸张上打印的或屏幕上显⽰的英⽂单词都算作明⽂。
其次,我们需要能将明⽂表⽰的消息转成另外某种表⽰,我们还需要能将编码⽂本转回成明⽂。
从明⽂到编码⽂本的转换称为“编码”,从编码⽂本⼜转回成明⽂则为“解码”。
编码问题是个⼤问题,如果不彻底解决,它就会像隐藏在丛林中的⼩蛇,时不时地咬你⼀⼝。
那么到底什么是编码呢?//ASCII记住⼀句话:计算机中的所有数据,不论是⽂字、图⽚、视频、还是⾳频⽂件,本质上最终都是按照类似 01010101 的⼆进制存储的。
再说简单点,计算机只懂⼆进制数字!所以,⽬的明确了:如何将我们能识别的符号唯⼀的与⼀组⼆进制数字对应上?于是美利坚的同志想到通过⼀个电平的⾼低状态来代指0或1,⼋个电平做为⼀组就可以表⽰出256种不同状态,每种状态就唯⼀对应⼀个字符,⽐如A--->00010001,⽽英⽂只有26个字符,算上⼀些特殊字符和数字,128个状态也够⽤了;每个电平称为⼀个⽐特为,约定8个⽐特位构成⼀个字节,这样计算机就可以⽤127个不同字节来存储英语的⽂字了。
这就是ASCII编码。
扩展ANSI编码刚才说了,最开始,⼀个字节有⼋位,但是最⾼位没⽤上,默认为0;后来为了计算机也可以表⽰拉丁⽂,就将最后⼀位也⽤上了,从128到255的字符集对应拉丁⽂啦。
⾄此,⼀个字节就⽤满了!//GB2312计算机漂洋过海来到中国后,问题来了,计算机不认识中⽂,当然也没法显⽰中⽂;⽽且⼀个字节所有状态都被占满了,万恶的帝国主义亡我之⼼不死啊!我党也是棒,⾃⼒更⽣,⾃⼰重写⼀张表,直接⽣猛地将扩展的第⼋位对应拉丁⽂全部删掉,规定⼀个⼩于127的字符的意义与原来相同,但两个⼤于127的字符连在⼀起时,就表⽰⼀个汉字,前⾯的⼀个字节(他称之为⾼字节)从0xA1⽤到0xF7,后⾯⼀个字节(低字节)从0xA1到0xFE,这样我们就可以组合出⼤约7000多个简体汉字了;这种汉字⽅案叫做 “GB2312”。
国际化字符集编码格式

国际化字符集编码格式国际化字符集编码格式(Internationalization Character Encoding Scheme)是指用于解决不同国家或地区语言文字编码与传输问题的一种编码方案。
随着信息技术的不断发展,世界各地交流的必要性也越来越强,而国际化字符集编码格式为跨国交流提供了基础保障。
一、什么是国际化字符集编码格式?国际化字符集编码格式就是对不同国家或地区语言文字的编码格式进行规范化,以保证信息数字化可传输和可读取。
例如,汉字采用的GB2312编码方式只包含了简体中文,而Big5编码方式只包含了繁体中文,这样的编码方案显然无法应对跨国交流的各种需求。
二、国际化字符集编码格式的发展历史在早期的计算机应用中,字符编码格式并没有被广泛规范化。
不同的计算机或软件使用不同的编码方式,导致交流困难,这被称作字符集混乱(Charset Chaos)。
后来,随着Unicode编码方式的出现,国际化字符集编码方式开始逐渐得到规范化,包括ASCII、ISO 8859、GB码、BIG码以及国际标准化组织制定的Unicode等多种编码方式。
三、国际化字符集编码格式的功能及应用国际化字符集编码格式可以实现以下两种基本功能:1、将不同的字符集编码方式转换为相应的国际化字符集编码方式,使得不同语种的文字内容可以正确传输和读取。
2、按照相关的规范制作或解析网页或软件代码,使得其对应的文本内容满足国际化字符集编码格式,以便网站或应用程序展现各种语言。
由于国际化字符集编码格式的应用范围非常广泛,如网站建设、软件开发、移动应用等等,对跨语言交流具有很强的必要性。
例如,经过国际化字符集编码格式处理的网页可以被各种浏览器正确解析,这为全球广泛的跨国网民提供了可靠的交流平台。
此外,移动应用也需要进行国际化应用程序的开发,以适应不同地区的语言环境需求,这就需要应用开发者首先考虑字符集编码问题。
四、国际化字符集编码格式的发展趋势虽然目前已有较多的国际化字符集编码格式,但由于不同国家和地区使用不同的编码方式,因此一直存在编码转换问题。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第十二章S truts国际化程序和中文编码问题第一节国际化问题概述一、什么是国际化编程1)国际化(Internationalization ):就是设计一个应用的流程,以使之能够不经过工程修改就可以使用于各种不同的语言和区域场所。
2)本地化(Localization ):通过添加特定场所的组建和翻译文本来使软件适用于特定的场所和语言的过程。
我们花费了大量的精力来开发自己的Web应用,当然都希望在应用的开发上得到更大的投资回报。
因为互联网连接着世界各地,每个应用都可以面对国际的受众。
如果某个应用可以被本地化,那么它就可以被更多的访问者所访问。
特别是在多语言的国家,比如比利时、加拿大、瑞士,甚至美国尤其重要。
3)本地化那些内容:当一个软件产品需要在全球范围应用的时候,得考虑在不同的地域和语言环境下面的使用情况(也就是国际化问题),最简单的要求就是UI上的信息上能用本地化语言来显示,这主要包括操作界面的风格问题、提示和帮助语言的版本问题、界面定制个性化问题等。
Java语言内核基于Unicode2.1提供了对不同国家和不同语言文字的内部支持,由于先天的原因,Java对于国际化的支持远远要比C/C++来的优越。
Struts的国际化能力是它本身提供的,但为了更好的理解国际化问题,我们先从Java语言国际化本身的技术谈起。
二、几个术语1)i18n(Internationalization):就是internationalization, 国际化,由于首字母"i"和末尾字母"n"间有18个字符,所以简称i18n. internationalization指为了使应用程序能适应不同的语言和地区间的变化而不作系统性的变化所采取的设计措施,即:将依赖于语言和地区的代码与和语言无关的代码分离开来的过程。
一旦程序完成了这项工作,它只需很少的工作就可以适用于不同语言的国家和地区。
2)l10n(Localization):就是localization, 本地化,由于首字母"l"和末尾字母"n"间有10个字母,所以简称l10n. localization指为了使应用软件能够在某一特定语言环境或地区使用而加入本地特殊化部件和翻译后文本的过程,即:使程序适用于特定语言或地区的过程,它不仅包括文本的翻译,还包括特定于文化的数据项格式的转换。
3)locale:简单来说是指语言和区域进行特殊组合的一个标志。
三、Java中如何解决国际化的问题:1)应用被国际化的基本要求:要被国际化,一个应用应该能够。
1.自动地区分不同的场所;2.使用同一个可执行包根据不同的场所显示相应的信息和标签;3.在不重新编译的情况下提供对新的场所的支持;4.自动格式化场所敏感的条目,比如日期和货币,为相应的场所和语言支持的格式。
2)Java 语言对国际化的支持国际化需求Java 类区别不同的场所java.util.Locale使用同一个可执行包根据不同的场所显示相应的信息和标签java.util.ResourceBundle自动格式化场所敏感的条目,比如日期和货币,为相应的场所和语言支持的格式java.text.MessageFormat另外由于Java语言具有平台无关、可移植性好等优点,并且提供了强大的类库,所以Java 语言可以辅助我们解决上述问题。
Java语言本身采用双字节字符编码,采用大汉字字符集,Java 本身在设计时,即针对国际化之需求采用Unicode作为系统内部的编码,这就为解决国际化问题提供了很多方便。
四、实现国际化程序的基本思路1)国际化的基本策略利用locale类区分地理地区:在Java平台中,每种语言和地区在Java中都存在一个标识符(参考上面的locale说明),每个与本地化敏感的类都可以保存它自己的与本地化有关的信息,所有对本地化敏感的操作都可以明确指定一个地区标识符作为参数,这样,就大大简化了多语言程序。
利用资源文件文件来分离与语言有关的内容:从设计角度来说,只要把程序中与语言和文化有关的部分分离出来,加上特殊处理(单独提取出来并放到资源文件中),就可以部分解决国际化问题。
采用参数化的手段来定制界面:在界面风格的定制方面,我们可以把参数化的元素,如字体、颜色等,存储在数据库里,以便为用户提供友好的界面;如果某些部分包含无法参数化的元素,那么我们可能不得不分别设计,通过有针对性的编码来解决具体问题。
2)国际化程序的特征文本元素在程序中不进行硬编码。
它们存储于源代码之外,可自动进行动态检索;通过使用附加的本地化数据,统一可执行程序,可在世界各地运行;支持新的语言时无须重新编译;与文化有关的数据(如日期和货币),其格式根据最终用户的地区和语言而定并可以迅速进行本地化。
五、Java中与国际化问题相关的包与类在用Java解决国际化问题的过程中,可能利用到的主要的类都是由java.util包提供的。
该包中相关的类有Locale、ResourceBundle、ListResourceBundle、PropertyResourceBundle等,其继承关系如下图所示。
其中的各个类所提供的主要功能如下:1)Locale类该类包含对主要地理区域的地域化特征的封装。
其特定对象表示某一特定的地理、政治或文化区域。
通过设定Locale,我们可以为特定的国家或地区提供符合当地文化习惯的字体、符号、图标和表达格式。
例如,我们可以通过获得特定Locale下的Calendar类的实例,显示符合特定表达格式的日期。
Java使用兩個字符串代碼來表示不同的区域,分別是「语言」和「国家」,这两个代码遵守国际标准组织的标准,语言是遵守ISO-639的兩個小写英文字母來表示,而国家則使用ISO-3166的两个大写字母來表示。
完整的代碼,可在下列网址取得:/pub/ietf/http/related/iso639.txt,http://www.chemie.fu-berlin.de/diverse/doc/ISO_3166.html 。
依照此标准,中文的代码是zh、英文的代码是en 、台湾的区域代码是TW、美国的区域代码是US、中国大陆的区域代码是CN。
语言代码说明国家或地区代码说明de German CN Chinaes Spanish CA Canadaen English DE Germanyfr French FR Franceja Japanese IN Indiajw Javanese US United Stateko Korean TW TaiWanzh Chinese注意:台湾的繁体为:zh-TW。
比如,对讲法语的加拿大人可以创建这样的场所:Locale locale = new Locale("fr", "CA");比如,中国大陆可以创建这样的场所:Locale locale = new Locale("zh", "CN");2)ResourceBundle:资源包(resource bundle)在设计一个国际化的应用时,你首先应该将注意力集中在用户接口上。
应用所使用的各种各样的菜单、对话框通常称为是程序资源。
许多编程环境的设计都允许用户接口可以从一个单独的文件-----资源包中来导入。
ResourceBundle类该类是一个抽象类,需要通过静态方法ResourceBundle.getBundle()指定具体实现类或属性文件的基本名称。
基本名称会协同指定的或默认的Locale类(程序执行时会按照系统环境预设的语言及区域,去取得相对应的属性文件),决定具体调用的类或属性文件的唯一名称。
例如:指定基本类或属性文件名称为TestBundle,而指定的Locale是CHINESE,那么最适合匹配的类名称为TestBundle_zh_CN.class,而最佳匹配属性文件名称为TestBundle_zh_CN.properties。
3)ListResourceBundle:该类继承ResourceBundle类,主要是增加了一些便于操作的方法,但由于它还是抽象类。
如果希望使用类的方式实现具体的ResourceBundle,一般情况下最好继承这个类。
4)PropertyResourceBundle:继承关系:该类也继承ResourceBundle类,可以实例化。
该类的行为特征如同java.util.properties类,利用它可以从输入流中获得具体属性对。
PropertyResourceBundle类是由属性文件(.properties)来取得程序中所需要的字串資源。
属性文件的名称命名规则该类用来管理一个文本消息集合,消息可以从一个属性文件中载入。
属性文件是一个简单的文本文件,而每个文本对应的场所则可以用一种缩写习惯所命名。
语言和国家代码被添加到文件名称的末尾,扩展名之前。
象下面这样:Applicatiopn_es_ES.propertyApplication_fr_FR.propertyApplication.property六、資源字串利用資源字串解决程序中的显示的文字语言种类---- 利用属性文件1)使用属性文件的优点属性文件是一个标准的文本文件,因此我們不需要重新编译程序的原始代码即可轻易增加不同区域的字串资源,这是优点也是其缺点,因为这样的区域资源將可轻易被修改。
且使用資源文件只能儲存“字串”資源,如果有其他类型的内容也需要因不同的区域,而有不同的内容时,則使用資源文件將无法滿足我們的需求。
这时就需要使用ResourceBundle 的另一个子类ListResourceBundle(利用类的方式)。
2)属性文件的命名格式类名_语言_国家.properties ,比如JavaWord_zh_CN.properties。
并在该属性文件中以Key=Value 形式给出属性项目,并且每个属性项目的值应该是Unicode编码的符号。
比如以中国大陆的使用环境为例,要存储符合我們使用的属性项目,则应该存储在JavaWord_zh_CN.properties文件中,而符合使用在中国台湾的属性文件名称就应该为JavaWord_zh_TW.properties。
我们可以针对不同的语言和地区提供不同的属性文件,在不同的属性文件中存储程序中的不同环境的字串资源。
第二节可以显示多国语言的程序实例1)不能国际化的程序我们先看一个不使用i18n处理的程序代码:public class NoI18nDemo {static public void main(String[] args) {System.out.println("Hello.");System.out.println("What is your major?");System.out.println("My major is computer technology.");}}2)语言信息存储文件显然,上述程序并不能显示多国文字,为了能显示多国文字,首先需要建立语言信息存储文件:建立四个文件(默认信息,美国,德国,中国):默认信息是指不输入文字信息时显示的字符文档,当输入错误的文字信息的时候,将显示平台默认字符模式。