字符编码之间的相互转换
codesys ascii码转换指令

标题:深度探讨CODESYS ASCII码转换指令在工业自动化领域中,PLC编程是一个非常重要的环节。
而对于其中的编码问题,很多初学者可能会遇到困惑。
本文将深入探讨CODESYS 中的ASCII码转换指令,希望可以为读者带来一些帮助和启发。
1. 什么是CODESYS ASCII码转换指令CODESYS是一种用于编写控制程序的开发环境,它支持多种编程语言和标准化的PLC编程。
而ASCII码转换指令则是其中的一个重要功能,它可以实现字符与ASCII码之间的相互转换。
在实际的工程中,我们经常需要将字符转换为ASCII码或者反向操作,以满足不同设备之间的通讯需要。
2. ASCII码转换指令的基本语法在CODESYS中,ASCII码转换指令主要包括TO_ASCII、TO_X和TO_STRING这三种基本形式。
其中,TO_ASCII可以将字符转换为对应的ASCII码,TO_X可以将数字直接转换为对应的字符,TO_STRING则可以将ASCII码数组转换为字符串类型。
这些指令的语法简单易懂,但在实际使用中需要注意参数的正确传递和数据类型的匹配。
3. ASCII码转换指令的应用场景在实际工程中,ASCII码转换指令可以广泛应用于各种设备之间的通讯和数据处理过程中。
比如在串口通讯中,我们经常需要将字符转换为ASCII码发送到其他设备;在人机界面中,我们也经常需要将ASCII码转换为字符进行显示和交互。
了解和熟练掌握这些指令,对于提高工程师的编程效率和质量都有很大的帮助。
4. 个人观点和总结在工业自动化领域,编程是一项极为重要的工作。
而对于其中的编码问题,掌握好ASCII码转换指令是非常必要的。
它不仅可以提高工程师的编程效率和质量,还可以拓展程序的应用范围和灵活性。
我个人认为深入了解和熟练掌握这些指令是每个PLC编程人员都应该做到的。
以上就是对CODESYS ASCII码转换指令的深入探讨,希望对读者有所帮助。
希望读者在实际应用中能够灵活运用这些指令,为工程的顺利进行贡献自己的一份力量。
Python的ASCII,GB2312,Unicode,UTF-8相互转换

Python的ASCII,GB2312,Unicode,UTF-8相互转换ASCII 是⼀种字符集,包括⼤⼩写的英⽂字母、数字、控制字符等,它⽤⼀个字节表⽰,范围是 0-127 Unicode分为UTF-8和UTF-16。
UTF-8变长度的,最多 6 个字节,⼩于 127 的字符⽤⼀个字节表⽰,与 ASCII 字符集的结果⼀样,ASCII 编码下的英语⽂本不需要修改就可以当作 UTF-8 编码进⾏处理。
Python 从 2.2 开始⽀持 Unicode ,函数 decode( char_set )可以实现其它编码到 Unicode 的转换,函数 encode( char_set )实现 Unicode 到其它编码⽅式的转换。
⽐如("你好").decode( "GB2312")将得到u'\u4f60\u597d',即 "你"和“好"的 Unicode 码分别是 0x4f60 和 0x597d再⽤(u'\u4f60\u597d').encode("UTF-8")将得到'\xe4\xbd\xa0\xe5\xa5\xbd'它是 “你好”的UTF-8编码结果。
python中使⽤ unicode的关键:unicode是⼀个类,函数unicode(str,"utf8")从utf8编码(当然也可以是别的编码)的字符串str⽣成 unicode类的对象,⽽函数unc.encode("utf8")将unicode类的对象unc转换为(编码为)utf8编码(当然也可以是别的编码)的字符串。
于是,编写unicode相关程序,需要做的事情是 * 获取数据(字符串)时,⽤unicode(str, "utf8")⽣成unicode对象 * 在程序中仅使⽤unicode对象,对程序中出现的字符串常量都以u"字符串"的形式书写 * 输出时,可将unicode对象转换为任意编码输出,使⽤str.encode("some_encoding")>>> unicode("你好", "utf8")u'\u4f60\u597d'>>> x = _>>> type(x)>>> type("你好")>>> x.encode("utf8")'\xe4\xbd\xa0\xe5\xa5\xbd'>>> x.encode("gbk")'\xc4\xe3\xba\xc3'>>> x.encode("gb2312")'\xc4\xe3\xba\xc3'>>> print x你好>>> print x.encode("utf8")你好>>> print x.encode("gbk")以上是测试结果(Ubuntu 6.06,locale为utf8),注意type(x)和type("你好")的区别。
ucs2编码和utf8编码关系

ucs2编码和utf8编码关系一、引言编码是计算机中非常重要的概念,它是将字符转换为二进制数的过程。
在计算机中,字符是以二进制数的形式存储的,因此编码可以看作是将字符转换为计算机可以识别的二进制数的过程。
在编码中,ucs2和utf8是两种常见的编码方式。
二、ucs2编码1. ucs2编码概述ucs2(Universal Character Set 2)编码是一种固定长度的Unicode编码方式。
它使用16位(即2个字节)来表示一个字符,因此可以表示65536个不同的字符。
2. ucs2编码特点(1)固定长度:每个字符都占用16位,即2个字节。
(2)适合表示亚洲语言:由于亚洲语言中有大量汉字等复杂字符,而ucs2编码能够覆盖这些字符,因此适合用于表示亚洲语言。
(3)不支持扩展:由于每个字符都占用16位,因此不能够支持Unicode扩展区域中新增加的字符。
三、utf8编码1. utf8编码概述utf8(Unicode Transformation Format 8-bit)是一种可变长度的Unicode编码方式。
它使用1-4个字节来表示一个字符,根据需要动态调整字节长度。
2. utf8编码特点(1)可变长度:每个字符所占用的字节数不固定,根据需要动态调整字节长度。
(2)兼容ASCII:对于ASCII字符,utf8编码只需要使用一个字节来表示。
(3)支持扩展:由于每个字符所占用的字节数不固定,因此可以支持Unicode扩展区域中新增加的字符。
四、ucs2编码和utf8编码关系1. ucs2编码和utf8编码之间的转换ucs2编码和utf8编码之间可以进行相互转换。
对于单个字符,可以通过将其转换为二进制数后再进行相应的转换。
对于多个字符组成的字符串,则需要先将其进行分割,然后对每个字符进行转换。
2. ucs2编码和utf8编码的应用场景(1)ucs2编码适合用于表示亚洲语言,在一些中文网站和应用程序中广泛使用。
#是什么编码unicode两种编码方式与中文的转换

#是什么编码unicode两种编码⽅式与中⽂的转换unicode的表⽰⽅式有两种,⼀种为web页⾯中使⽤的,⼀种为我们⼀般采⽤的编码⽅式第⼀种:"成都 "Unicode编码⽅式 &+编号是⽹页⾥引⽤unicode字符的⽅法,编号为⼗进制的在unicode中的编号第⼆种:\u6210\u90fd 表⽰的也是成都,采⽤的也是unicode编码格式,是java编程中使⽤的编码格式它以\u开头,后接四位16进制的数。
以下是java中之间相互转化的代码/** string与unicode之间相互转换*/import java.util.regex.Matcher;import java.util.regex.Pattern;public class unicodeString {public static void main(String[] args) {String str = "中国";System.out.println(unicodeString.StringToWebUnicode(str));System.out.println(unicodeString.WebUnicodeToString("中国"));System.out.println(unicodeString.StringToUnicode(str));System.out.println(unicodeString.UnicodeToString("\u4e2d\u56fd\\uqqqq"));}/** 普通类型的unicode转string*/public static String UnicodeToString(String input) {Pattern pattern = pile("(\\\\u(\\p{XDigit}{4}))");Matcher matcher = pattern.matcher(input);char ch;while (matcher.find()) {ch = (char) Integer.parseInt(matcher.group(2), 16);input = input.replace(matcher.group(1), ch + "");}return input;}/** string转普通类型的unicode*/public static String StringToUnicode(String input) {String str = "";for (char c : input.toCharArray()) {if ((int) c > 128)str += "\\u" + Integer.toHexString((int) c);elsestr += c;}return str;}/** string转web类型的unicode*/public static String StringToWebUnicode(String input) {String str = "";for (char c : input.toCharArray()) {str += "&#" + (int) c + ";";}return str;}/** web类型的unicode转string*/public static String WebUnicodeToString(String input) {String str = "";String[] y1 = input.split(";");for (String c : y1) {if (c.length() > 2) {str += (char) Integer.parseInt(c.substring(2));}}return str;}}js下将unicode转换为中⽂或字符串的代码<script>//带;号var str="最新發https://www.jb51.net/article/1.htm //不带分号var str2="https://www.jb51.net/article/1.htm";function uncode(str) {return str.replace(/&#(x)?([^&]{1,5});?/g, function (a, b, c) {return String.fromCharCode(parseInt(c, b ? 16 : 10));})}document.write(uncode(str));document.write("<br>");document.write(uncode(str2));</script>&#是什么编码在⽹页中以&#开头的是HTML实体,⼀些字符在 HTML 中是预留的,拥有特殊的含义,⽐如⼩于号‘<’⽤于定义 HTML 标签的开始。
常用编码方式及其格式转换

常用编码方式及其格式转换编码方式是计算机处理信息和传输信息的重要工具,它允许我们通过在不同计算机系统之间保存和传输数据来改善数据交换的效率。
在这种情况下,一个编码方式可以翻译计算机数据,使其可以通过不同的计算机系统传输。
常用的编码方式有二进制编码、字符编码、Unicode编码、UTF-8编码等,它们各有特定用途,适用于不同的系统、不同的数据和不同的媒介。
首先,二进制编码是计算机最基本的表示形式,二进制编码由二进制位组成,每个二进制位只有两个状态:1和0。
这种编码常用于硬件控制,因为每个二进制位只有两种可能的状态,可以非常容易地用0和1来表示计算机的输入和输出。
其次,字符编码是将排列的字符表示为对应的数字码,比如ASCII,它在英文中可以表示128个字符。
如果想要在不同的计算机语言中准确传输数据,那么字符编码就十分重要,因为它代表了每个字母或符号的数字码,所以可以非常准确地传输数据。
此外,Unicode编码是一种超大容量的编码方式,支持多种语言。
相比于其他编码方式,Unicode编码可以记录更多的字符,比如中文字母等。
Unicode可以用16位的编码表示数据,并且Unicode编码也可以将不同的语言进行编码转换,使得不同的机器可以正确识别不同的语言。
最后,UTF-8编码是Unicode的一种变种,它支持英文、中文、日语、韩语等多种语言,使用8位的编码表示,比Unicode编码更加紧凑。
UTF-8编码支持中文、拉丁文、希腊文等多种语言,是网页上常用的编码,打开网页时,编码一般为UTF-8。
总结以上,常用的编码方式有二进制编码、字符编码、Unicode 编码和UTF-8编码,他们都有特定的用途,每种编码都可以用来在不同的计算机系统之间传输信息或是表示不同的字符。
不同的编码方式也可以互相转换,比如二进制编码和字符编码可以互相转换,Unicode 编码可以转换成UTF-8编码,这使得不同的计算机系统之间可以顺利地传输信息。
ansi to utf-8 converter的用法

ansi to utf-8 converter的用法ANSI to UTF-8 Converter 是一种用于将 ANSI 编码的文本转换为 UTF-8 编码的工具。
在理解其用法之前,我们需要了解一些相关的背景知识。
1. ANSI 编码和 UTF-8 编码的区别:ANSI(American National Standards Institute)是一种字符编码标准,用于以 8 位字节的形式表示英文字符和一些特殊字符。
然而,ANSI 编码不支持国际字符集。
相比之下,UTF-8(Unicode Transformation Format)是一种更为通用的字符编码标准,支持几乎所有国际语言的字符。
2. ANSI 编码与 UTF-8 编码之间的转换:ANSI 编码和 UTF-8 编码之间的转换是必要的,特别是在处理包含多种语言字符的文本时。
ANSI 编码的文本可能无法正确显示或处理某些国际字符。
而将文本转换为 UTF-8 编码可以确保文本文件在任何设备或操作系统上都能正确显示。
ANSI to UTF-8 Converter 提供了一个简单而强大的工具,帮助我们轻松地完成 ANSI 编码到 UTF-8 编码的转换。
以下是其主要的用法和操作步骤:1. 下载和安装:首先,我们需要从官方网站或可信的来源下载和安装 ANSIto UTF-8 Converter。
安装完成后,可以在我们的计算机上找到相应的应用程序。
2. 打开 ANSI 到 UTF-8 Converter:双击打开已安装的 ANSI to UTF-8 Converter 应用程序。
一旦应用程序加载完成,我们将看到一个简单的用户界面。
3. 选择文件:在 ANSI to UTF-8 Converter 的用户界面中,我们可以看到一个“选择文件”按钮。
点击该按钮来选择需要转换的 ANSI 编码文本文件。
可以是单个文件或多个文件。
4. 文件预览:选择文件后,ANSI to UTF-8 Converter 将显示该文件的预览。
unicode与ansi转换规则

unicode与ansi转换规则Unicode和ANSI都是字符编码标准,但是它们之间存在转换规则,因为两种编码方式之间并不兼容。
在进行字符转换时,需要一定的方法来确保成功转换。
本文将阐述Unicode和ANSI之间的转换规则,并详细描述如何完成转换。
一、Unicode和ANSI的概述Unicode是一种字符编码标准,可以用来表示世界上大多数语言的字符。
它的编码范围广泛,包括从基本的拉丁字母到中文和阿拉伯字符。
Unicode使用16位和32位编码方案,其中16位编码支持计算机基础设施的交换,32位编码则支持更高级别的语言如藏文和古文物。
ANSI(American National Standards Institute)是一种表示字符的方式,是一种针对西方语言所设计的字符编码标准。
ANSI编码支持虚拟码、ASCII码和扩展ASCII码。
二、Unicode向ANSI转换的方法以下列出三种常见的Unicode向ANSI转换的方法。
1、直接截取转换Unicode和ANSI编码之间存在一种直接截取的转换方法。
但需要注意的是,这种方法只适用于转换基本ASCII字符,不适用于转换包含特殊字符或扩展字符集的Unicode字符串。
例如,将Unicode字符串“Hello World”转换为ANSI格式。
在此示例中,ASCII字符集不包括特殊字符或扩展字符集,因此,直接使用左到右转换将字符截取即可。
Unicode字符串:H e l l o W o r l dANSI字符串:H e l l o W o r l d2、使用API转换许多编程语言提供了API(应用程序接口)来支持Unicode和ANSI之间的相互转换。
在这种情况下,可以使用API转换在Unicode和ANSI之间进行转换,而不必考虑具体字符集的范围。
在C ++中,可以使用WideCharToMultiByte API将Unicode字符串转换为ANSI字符串。
【miscellaneous】【CC++语言】UTF8与GBK字符编码之间的相互转换

【miscellaneous】【CC++语⾔】UTF8与GBK字符编码之间的相互转换⼀预备知识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这样的⽂件。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
字符编码之间的相互转换 UTF8与GBKC++ 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 大 10 010000 笨 10100000 蛋 11000000 中 00000100 国 00001000下面是我定义的 zixia 编码方案(8位),可以看到它的编码中表示了aka字符集的所有字符对应的代码单元;北 10000001 京 10000010 香 00000001 蕉 00000010 是 00000100 个 00001000 大 00010000 笨 00100000 蛋 01000000 中 10000100 国 10001000所谓文本文件就是我们按一定编码方式将二进制数据表示为对应的文本如 00000001000000100000010000001000000100000010000001000000这样的文件。
我用一个支持 zixia编码和aka字符集的记事本打开,它就按照编码方案显示为“香蕉是个大笨蛋”如果我把这些字符按照GBK另存一个文件,那么则肯定不是这个,而是 1100111111100011 1011110110110110 1100101011000111 1011100011110110 101101001 1110011 1011000110111111 1011010110110000 110100001010二,字符集1,常用字符集分类 ASCII及其扩展字符集作用:表语英语及西欧语言。
位数:ASCII是用7位表示的,能表示128个字符;其扩展使用8位表示,表示256个字符。
范围:ASCII从00到7F,扩展从00到FF。
ISO-8859-1字符集作用:扩展ASCII,表示西欧、希腊语等。
位数:8位,范围:从00到FF,兼容ASCII字符集。
GB2312字符集作用:国家简体中文字符集,兼容ASCII。
位数:使用2个字节表示,能表示7445个符号,包括6763个汉字,几乎覆盖所有高频率汉字。
范围:高字节从A1到F7, 低字节从A1到FE。
将高字节和低字节分别加上0XA0即可得到编码。
BIG5字符集作用:统一繁体字编码。
位数:使用2个字节表示,表示13053个汉字。
范围:高字节从A1到F9,低字节从40到7E,A1到FE。
GBK字符集作用:它是GB2312的扩展,加入对繁体字的支持,兼容GB2312。
位数:使用2个字节表示,可表示21886个字符。
范围:高字节从81到FE,低字节从40到FE。
GB18030字符集作用:它解决了中文、日文、朝鲜语等的编码,兼容GBK。
位数:它采用变字节表示(1 ASCII,2,4字节)。
可表示27484个文字。
范围:1字节从00到7F; 2字节高字节从81到FE,低字节从40到7E和80到FE;4字节第一三字节从81到FE,第二四字节从30到39。
UCS 字符集作用:国际标准 ISO 10646 定义了通用字符集 (Universal Character Set)。
它是与UNICODE同类的组织,UCS-2和UNICODE兼容。
位数:它有UCS-2和UCS-4两种格式,分别是2字节和4字节。
范围:目前,UCS-4只是在UCS-2前面加了0×0000。
UNICODE字符集作用:为世界650种语言进行统一编码,兼容ISO-8859-1。
位数:UNICODE字符集有多个编码方式,分别是UTF-8,UTF-16和UTF-32。
2 ,按所表示的文字分类语言字符集正式名称英语、西欧语 ASCII,ISO-8859-1 MBCS 多字节简体中文 GB2312 MBCS 多字节繁体中文 BIG5 MBCS 多字节简繁中文 GBK MBCS 多字节中文、日文及朝鲜语 GB18030 MBCS 多字节各国语言 UNICODE,UCS DBCS 宽字节三,编码 UTF-8:采用变长字节 (1 ASCII, 2 希腊字母, 3 汉字, 4 平面符号) 表示,网络传输, 即使错了一个字节,不影响其他字节,而双字节只要一个错了,其他也错了,具体如下:如果只有一个字节则其最高二进制位为0;如果是多字节,其第一个字节从最高位开始,连续的二进制位值为1的个数决定了其编码的字节数,其余各字节均以10开头。
UTF-8最多可用到6个字节。
UTF-16:采用2字节,Unicode中不同部分的字符都同样基于现有的标准。
这是为了便于转换。
从 0×0000到0×007F是ASCII字符,从0×0080到0×00FF是ISO-8859-1对ASCII的扩展。
希腊字母表使用从0×0370到 0×03FF 的代码,斯拉夫语使用从0×0400到0×04FF的代码,美国使用从0×0530到0×058F的代码,希伯来语使用从0×0590到0×05FF的代码。
中国、日本和韩国的象形文字(总称为CJK)占用了从0×3000到0×9FFF 的代码;由于0×00在c语言及操作系统文件名等中有特殊意义,故很多情况下需要UTF-8编码保存文本,去掉这个0×00。
举例如下: UTF-16: 0×0080 = 0000 0000 1000 0000 UTF-8: 0xC280 = 1100 0010 1000 0000 UTF-32:采用4字节。
优缺点 UTF-8、UTF-16和UTF-32都可以表示有效编码空间 (U+000000-U+10FFFF) 内的所有Unicode字符。
使用UTF-8编码时ASCII字符只占1个字节,存储效率比较高,适用于拉丁字符较多的场合以节省空间。
对于大多数非拉丁字符(如中文和日文)来说,UTF-16所需存储空间最小,每个字符只占2个字节。
Windows NT内核是Unicode(UTF-16),采用UTF-16编码在调用系统API时无需转换,处理速度也比较快。
采用UTF-16和UTF-32会有Big Endian 和Little Endian之分,而UTF-8则没有字节顺序问题,所以UTF-8适合传输和通信。
UTF-32采用4字节编码,一方面处理速度比较快,但另一方面也浪费了大量空间,影响传输速度,因而很少使用。
四,如何判断字符集 1,字节序首先说一下字节序对编码的影响,字节序分为Big Endian字节序和Little Endian字节序。
不同的处理器可能不一样。
所以,传输时需要告诉处理器当时的编码字节序。
对于前者而言,高位字节存在低地址,低字节存于高地址;后者相反。
例如,0X03AB, Big Endian字节序 0000: 0 3 0001: AB Little Endian字节序是 0000: AB 0001: 0 3 2,编码识别 UNICODE,根据前几个字节可以判断UNICODE字符集的各种编码,叫做Byte Order Mask方法BOM: UTF-8: EFBBBF (符合UTF-8格式,请看上面。
但没有含义在UCS 即UNICODE中) UTF-16 Big Endian:FEFF (没有含义在UCS-2中) UTF-16 Little Endian:FFFE (没有含义在UCS-2中) UTF-32 Big Endian:0000FEFF (没有含义在UCS-4中) UTF-32 Little Endian:FFFE0000 (没有含义在UCS-4中) GB2312:高字节和低字节的第1位都是1。
BIG5,GBK&GB18030:高字节的第1位为1。
操作系统有默认的编码,常为GBK,可以下载别的并升级。
通过判断高字节的第1位从而知道是ASCII或者汉字编码。
#include <stdio.h> #include <windows.h>//GBK编码转换到UTF8编码int GBKToUTF8(unsigned char * lpGBKStr,unsigned char * lpUTF8Str,int nUTF8StrLen) {wchar_t * lpUnicodeStr = NULL; int nRetLen = 0;if(!lpGBKStr) //如果GBK字符串为NULL则出错退出 return 0;nRetLen = ::MultiByteToWideChar(CP_ACP,0,(char *)lpGBKStr,-1,NULL,NULL); //获取转换到Unicode编码后所需要的字符空间长度lpUnicodeStr = new WCHAR[nRetLen + 1]; //为Unicode字符串空间nRetLen = ::MultiByteToWideChar(CP_ACP,0,(char *)lpGBKStr,-1,lpUnicodeStr,nRetLen); //转换到Unicode编码if(!nRetLen) //转换失败则出错退出 return 0;nRetLen = ::WideCharToMultiByte(CP_UTF8,0,lpUnicodeStr,-1,NULL,0,NULL,NULL); //获取转换到UTF8编码后所需要的字符空间长度if(!lpUTF8Str) //输出缓冲区为空则返回转换后需要的空间大小 {if(lpUnicodeStr) delete []lpUnicodeStr; return nRetLen; }if(nUTF8StrLen < nRetLen) //如果输出缓冲区长度不够则退出 {if(lpUnicodeStr)delete []lpUnicodeStr; return 0; }nRetLen = ::WideCharToMultiByte(CP_UTF8,0,lpUnicodeStr,-1,(char *)lpUTF8Str,nUTF8StrLen,N ULL,NULL); //转换到UTF8编码if(lpUnicodeStr)delete []lpUnicodeStr;return nRetLen; }//使用这两个函数的例子 int main() {char cGBKStr[] = "我是中国人!"; char * lpGBKStr = NULL; char * lpUTF8Str = NULL; FILE * fp = NULL; int nRetLen = 0;nRetLen = GBKToUTF8((unsigned char *) cGBKStr,NULL,NULL); printf("转换后的字符串需要的空间长度为:%d ",nRetLen); lpUTF8Str = new char[nRetLen + 1];nRetLen = GBKToUTF8((unsigned char *)cGBKStr,(unsigned char *)lpUTF8Str,nRetLen);if(nRetLen) {printf("GBKToUTF8转换成功!"); } else {printf("GBKToUTF8转换失败!"); goto Ret0; }fp = fopen("C:\\GBKtoUTF8.txt","wb"); //保存到文本文件 fwrite(lpUTF8Str,nRetLen,1,fp); fclose(fp);getchar(); //先去打开那个文本文件看看,单击记事本的“文件”-“另存为”菜单,在对话框中看到编码框变为了“UTF-8”说明转换成功了Ret0:{if(lpGBKStr)delete []lpGBKStr; if(lpUTF8Str)delete []lpUTF8Str; }return 0; }1 class CChineseCode23 { 45 public: 67 static void UTF_8ToUnicode(wchar_t* pOut,char *pText); // 把UTF-8转换成Unicode 8 9 static void UnicodeToUTF_8(char* pOut,wchar_t* pText); //Unicode 转换成UTF-8 10 11 static void UnicodeToGB2312(char* pOut,wchar_t uData); // 把Unicode 转换成 GB2312 1213 static void Gb2312ToUnicode(wchar_t* pOut,char *gbBuffer);// GB2312 转换成 Unicode 1415 static void GB2312ToUTF_8(string& pOut,char *pText, int pLen);//GB2312 转为 UTF-8 1617 static void UTF_8ToGB2312(string &pOut, char *pText, int pLen);//UTF-8 转为 GB2312 18 19 }; 2021 类实现 2223 void CChineseCode::UTF_8ToUnicode(wchar_t* pOut,char *pText) 24 25 { 2627 char* uchar = (char *)pOut; 2829 uchar[1] = ((pText[0] & 0x0F) << 4) + ((pText[1] >> 2) & 0x0F); 3031 uchar[0] = ((pText[1] & 0x03) << 6) + (pText[2] & 0x3F); 3233 return; 34 35 } 3637 void CChineseCode::UnicodeToUTF_8(char* pOut,wchar_t* pText) 38 39 { 4041 // 注意 WCHAR高低字的顺序,低字节在前,高字节在后 4243 char* pchar = (char *)pText; 4445 pOut[0] = (0xE0 | ((pchar[1] & 0xF0) >> 4)); 4647 pOut[1] = (0x80 | ((pchar[1] & 0x0F) << 2)) + ((pchar[0] & 0xC0) >> 6); 4849 pOut[2] = (0x80 | (pchar[0] & 0x3F)); 5051 return; 52 53 } 5455 void CChineseCode::UnicodeToGB2312(char* pOut,wchar_t uData) 56 57 { 5859 WideCharToMultiByte(CP_ACP,NULL,&uData,1,pOut,sizeof(wchar_t),NULL,NULL); 6061 return; 6263 } 6465 void CChineseCode::Gb2312ToUnicode(wchar_t* pOut,char *gbBuffer) 6667 { 6869 ::MultiByteToWideChar(CP_ACP,MB_PRECOMPOSED,gbBuffer,2,pOut,1); 7071 return ; 72 73 } 7475 void CChineseCode::GB2312ToUTF_8(string& pOut,char *pText, int pLen) 76 77 { 7879 char buf[4]; 8081 int nLength = pLen* 3; 8283 char* rst = new char[nLength]; 8485 memset(buf,0,4); 8687 memset(rst,0,nLength); 8889 int i = 0; 9091 int j = 0; 9293 while(i < pLen) 9495 { 9697 //如果是英文直接复制就可以 9899 if( *(pText + i) >= 0) 100101 { 102103 rst[j++] = pText[i++]; 104105 } 106107 else 108109 {110111 wchar_t pbuffer; 112113 Gb2312ToUnicode(&pbuffer,pText+i); 114115 UnicodeToUTF_8(buf,&pbuffer); 116117 unsigned short int tmp = 0; 118119 tmp = rst[j] = buf[0]; 120121 tmp = rst[j+1] = buf[1]; 122123 tmp = rst[j+2] = buf[2]; 124125 j += 3; 126127 i += 2; 128129 } 130131 } 132133 rst[j] = ''; 134135 //返回结果 136137 pOut = rst; 138139 delete []rst; 140141 return; 142 143 } 144145 void CChineseCode::UTF_8ToGB2312(string &pOut, char *pText, int pLen) 146 147 { 148 149 char * newBuf = new char[pLen]; 150151 char Ctemp[4]; 152153 memset(Ctemp,0,4);154155 int i =0; 156157 int j = 0; 158159 while(i < pLen) 160161 { 162163 if(pText > 0) 164165 { 166167 newBuf[j++] = pText[i++]; 168169 } 170171 else 172173 { 174175 WCHAR Wtemp; 176177 UTF_8ToUnicode(&Wtemp,pText + i); 178179 UnicodeToGB2312(Ctemp,Wtemp); 180181 newBuf[j] = Ctemp[0]; 182183 newBuf[j + 1] = Ctemp[1]; 184185 i += 3; 186187 j += 2; 188189 } 190191 } 192193 newBuf[j] = ''; 194195 pOut = newBuf; 196197 delete []newBuf;198199 return;200201 }1、将GBK转换成UTF8string GBKToUTF8(const std::string& strGBK) { string strOutUTF8 = ""; WCHAR * str1;int n = MultiByteToWideChar(CP_ACP, 0, strGBK.c_str(), -1, NULL, 0); str1 = new WCHAR[n]; MultiByteToWideChar(CP_ACP, 0, strGBK.c_str(), -1, str1, n); n = WideCharToMultiByte(CP_UTF8, 0, str1, -1, NULL, 0, NULL, NULL); char * str2 = new char[n];WideCharToMultiByte(CP_UTF8, 0, str1, -1, str2, n, NULL, NULL); strOutUTF8 = str2; delete[]str1; str1 = NULL; delete[]str2;str2 = NULL; return strOutUTF8; }Wi d e C h a r To M u l t i B y t e把U N I C O D E转换成A S C I I码。