字符编码的转换
- 格式:doc
- 大小:191.00 KB
- 文档页数:29
C#基础知识:字符编码、编码转换⼀、 ASCII码我们知道,在计算机内部,所有的信息最终都表⽰为⼀个⼆进制的字符串。
每⼀个⼆进制位(bit)有0和1两种状态,因此⼋个⼆进制位就可以组合出256种状态,这被称为⼀个字节(byte)。
也就是说,⼀个字节⼀共可以⽤来表⽰256种不同的状态,每⼀个状态对应⼀个符号,就是256个符号,从00000000到11111111。
上个世纪60年代,美国制定了⼀套字符编码,对英语字符与⼆进制位之间的关系,做了统⼀规定。
这被称为ASCII码,⼀直沿⽤⾄今。
ASCII码⼀共规定了128个字符的编码,⽐如空格“SPACE”是32(⼆进制00100000),⼤写的字母A是65(⼆进制01000001)。
这128个符号(包括32个不能打印出来的控制符号),只占⽤了⼀个字节的后⾯7位,最前⾯的1位统⼀规定为0。
在C#中如果你想看看某个字母的ASCII码是多少,可以使⽤表⽰字符编码的类Encoding ,代码如下:string s = "a";byte[] ascii = Encoding.ASCII.GetBytes(s);我们通过调试器可以看到ascii中为97,也就是说a的ASCII码为97(1100001)⼆、⾮ASCII编码英语⽤128个符号编码就够了,但是⽤来表⽰其他语⾔,128个符号是不够的。
⽐如,在法语中,字母上⽅有注⾳符号,它就⽆法⽤ASCII码表⽰。
于是,⼀些欧洲国家就决定,利⽤字节中闲置的最⾼位编⼊新的符号。
⽐如,法语中的é的编码为130(⼆进制10000010)。
这样⼀来,这些欧洲国家使⽤的编码体系,可以表⽰最多256个符号。
但是,这⾥⼜出现了新的问题。
不同的国家有不同的字母,因此,哪怕它们都使⽤256个符号的编码⽅式,代表的字母却不⼀样。
⽐如,130在法语编码中代表了é,在希伯来语编码中却代表了字母Gimel ,在俄语编码中⼜会代表另⼀个符号。
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 将显示该文件的预览。
《深度剖析PHP中的Convert函数的用法》一、介绍在PHP编程语言中,Convert函数是一个非常重要的功能,它可以用来进行数据类型的转换、字符编码的转换以及其他一些常用的数据处理操作。
本文将深度剖析Convert函数的用法,从简单到复杂地介绍其功能和应用。
二、数据类型的转换在PHP中,Convert函数可以用来进行不同数据类型之间的转换。
可以将一个字符串转换为整数、将一个整数转换为字符串、将一个浮点数转换为整数等等。
这样的转换对于数据处理和格式化输出非常有用,可以帮助我们更加灵活地处理数据和展示结果。
三、字符编码的转换另外,Convert函数还可以用来进行字符编码之间的转换。
在国际化和多语言全球信息湾开发中,经常会遇到各种不同编码的字符,而Convert函数可以很方便地将它们互相转换,以保证全球信息湾的数据正常显示和交互。
四、其他常用的数据处理操作除了数据类型和字符编码的转换之外,Convert函数还可以用来进行一些其他常用的数据处理操作,比如字符串的截取、替换、合并等。
这些功能在日常的PHP编程中非常常见,通过Convert函数的灵活运用,我们可以更加简单地实现这些操作,提高编码效率和代码的可读性。
五、个人观点和理解对于PHP中Convert函数的用法,我个人认为它是一个非常重要和实用的功能。
它可以帮助我们处理各种类型的数据,并且在不同的编码环境下也能够正常工作,极大地简化了编程时对于数据处理的复杂度。
通过Convert函数的学习和掌握,我们可以更加深入地理解PHP语言的特性和灵活性,为我们的编码工作带来更大的便利。
六、总结和回顾PHP中Convert函数的用法涉及到数据类型转换、字符编码转换以及其他常用的数据处理操作。
通过本文的介绍和讲解,希望读者能够更加深入地理解并掌握这一重要功能,提高在PHP编程中的实际应用能力。
以上就是对PHP中Convert函数的用法的深度剖析,希望能够给大家带来一些帮助和启发。
UTF-8编码转汉字
UTF-8编码是一种常用的字符编码方式,用于表示Unicode字符集中的字符。
在UTF-8编码中,每个字母、数字、标点符号和其他字符都有一个对应的数字值,这些数字值在计算机中被存储和处理。
要将UTF-8编码转换为汉字,需要对UTF-8的编码规则进行解码和转换。
下面是一种常见的方法:
1.将UTF-8编码转换为二进制数值。
UTF-8编码使用1到4个
字节来表示每个字符,其中字节的数目取决于字符的Unicode编码值。
将每个字节转换为8位的二进制数值。
2.根据UTF-8编码规则确定每个字符所占的字节数。
根据UTF-
8的编码规则,可以确定每个字符所占的字节数,这样就可以正确提取出每个字符的编码。
3.将二进制数值转换为十六进制。
将每个字节的二进制数值转
换为对应的十六进制数值。
4.根据UTF-8编码表查找对应的Unicode编码。
使用UTF-8编
码表或Unicode编码表,查找每个字符对应的Unicode编码。
5.将Unicode编码转换为汉字。
将Unicode编码转换为相应的
汉字字符,可以通过编程语言的内置函数或库来实现,例如Python的chr()函数。
UTF-8编码不仅包含汉字字符,还包括其他各种字符。
因此,在转换UTF-8编码时,需要先确定所需转换的字符范围,并对字
符进行逐个转换。
另外,使用现有的编程语言和工具可以简化UTF-8编码转换过程,提供更便捷的实现方式。
ascii转换方法ASCII转换方法ASCII(American Standard Code for Information Interchange)即美国信息交换标准代码,是一种将字符转换为数字的编码方式。
它通过将字符与一个唯一的数字相对应,实现了计算机对字符的识别和处理。
ASCII编码是计算机系统中最常用的字符编码之一,几乎所有的现代计算机和通信设备都支持ASCII编码。
ASCII编码使用一个8位(即一个字节)的二进制数来表示一个字符,它总共定义了128个字符,包括数字、字母、标点符号以及一些控制字符。
ASCII编码中的每个字符都有一个唯一的编号,从0到127。
其中,0到31之间的编号是控制字符,用于控制计算机的一些功能,如换行、回车等;32到126之间的编号是可显示字符,包括数字、字母和标点符号;127是一个特殊字符,表示删除。
ASCII编码的转换方法非常简单,只需要将字符的ASCII码值转换为二进制数,即可表示该字符。
在计算机中,每个字符都有一个对应的ASCII码值。
例如,字母A的ASCII码值是65,对应的二进制数是01000001;数字0的ASCII码值是48,对应的二进制数是00110000。
通过将字符的ASCII码值转换为二进制数,计算机可以对字符进行存储、传输和处理。
在实际应用中,ASCII编码被广泛用于文本文件的存储和传输,以及计算机与外部设备的交互。
例如,在计算机网络中,HTTP协议使用ASCII编码来传输文本信息。
在编程中,ASCII编码也经常用于处理字符和字符串,如判断字符的大小写、比较字符串的大小等。
除了ASCII编码之外,还有其他的字符编码方式,如Unicode编码。
与ASCII编码只能表示128个字符不同,Unicode编码可以表示几乎所有的字符,包括各种语言的字符、符号和表情等。
Unicode编码使用16位或32位的二进制数来表示一个字符,可以满足全球范围内的字符需求。
标题:深度探讨UTF-8 16进制编码转换中文的全面指南在当今数字化时代,我们经常会遇到各种编码转换的需求,特别是在处理中文字符时。
而UTF-8编码作为一种最为常见的字符编码方式,其16进制编码转换中文的方法也成为了不可或缺的知识点。
在本文中,我将全面探讨UTF-8 16进制编码转换中文的相关知识,并为你提供深度和广度兼具的指南。
1. 了解UTF-8编码我们需要了解UTF-8编码的基本概念。
UTF-8是一种针对Unicode的可变长度字符编码,它可以将Unicode码点映射成1到4个字节,从而表示不同的字符。
在UTF-8编码中,中文字符通常采用3个字节进行存储,而其16进制编码则是以\x开头的形式表示。
中文字符“中”在UTF-8编码中的16进制表示为E4B8AD。
2. UTF-8 16进制编码转换中文接下来,让我们深入探讨UTF-8 16进制编码如何转换为中文字符。
在实际操作中,我们可以通过将16进制编码按照每两个字符一组进行分割,并使用特定的工具或代码进行转换,从而得到对应的中文字符。
对于16进制编码E4B8AD,我们可以通过将其分割为E4、B8、AD,并依次转换为相应的中文字符,即“中”。
3. 深入理解16进制编码转换原理我们还需要深入理解16进制编码转换的原理。
在计算机中,16进制编码是一种表示数字的进制方式,它将数字分割为16个等份,分别用0~9和A~F表示。
当我们将16进制编码转换为中文字符时,实际上是将一系列数字按照特定规则进行映射和转换,从而得到最终的中文字符。
4. 个人观点和理解就我个人而言,对于UTF-8 16进制编码转换中文的理解是非常重要的。
在实际工作中,我经常会遇到需要处理中文字符编码的情况,而对于UTF-8编码的深入理解和熟练运用,可以极大地提高工作效率和数据处理的准确性。
我认为掌握UTF-8 16进制编码转换中文的方法是非常有价值的。
总结回顾通过本文的全面探讨,我们对于UTF-8 16进制编码转换中文有了更深入的理解。
utf8编码互相转换-回复UTF-8编码是一种用来在计算机系统中表示字符的方法,它是一种全球通用的字符编码标准。
互相转换指的是在不同的编码方式之间转换字符的过程。
本文将分步骤回答互相转换的实现方法,并探讨其重要性和应用领域。
首先,我们需要了解UTF-8编码的基本原理。
UTF-8编码使用可变长度来表示字符,最常见的字符使用一个字节进行编码,而其他字符则可能使用两个、三个甚至四个字节进行编码。
此编码方式通过将字符映射到不同的二进制序列来表示不同的字符。
在进行编码和解码时,我们需要使用一些工具和技术。
下面是一些常见的方法:1. Python的`encode()`和`decode()`方法:Python提供了内置的字符串方法来实现编码和解码功能。
使用`encode()`方法可以将字符串转换为特定编码方式的字节序列,而使用`decode()`方法则可以将字节序列转换回字符串。
2. 在命令行中使用`iconv`命令:`iconv`是一个命令行工具,用于在各种编码和字符集之间进行转换。
通过输入`iconv -f <源编码> -t <目标编码> <文件>`命令,可以将一个文件从源编码转换为目标编码。
3. 在文本编辑器中使用转换工具:许多文本编辑器提供了内置的编码转换工具,可以方便地将文本从一种编码方式转换为另一种编码方式。
例如,使用记事本的"另存为"功能可以选择不同的编码方式保存文件。
互相转换的实现方法主要包括以下几个步骤:1. 确定源编码和目标编码:在进行字符编码转换之前,我们需要确定要从哪种编码方式转换为另一种编码方式。
通常情况下,我们会将源编码确定为已知的编码方式,而目标编码则是我们想要转换成的编码方式。
2. 选择合适的工具和技术:根据实际需求,选择合适的工具和技术来进行字符编码转换。
比如,如果需要将一个文件从一种编码方式转换为另一种编码方式,可以使用`iconv`命令;如果只需在编程环境中进行编码转换,可以使用Python的`encode()`和`decode()`方法。
utf8编码转汉字UTF-8是一种用于表示Unicode字符的编码方式,包括汉字在内的各种字符都可以通过UTF-8进行编码和解码。
下面我会从多个角度来回答你关于UTF-8编码转换为汉字的问题。
1. UTF-8编码的基本原理:UTF-8使用变长编码方式,将Unicode字符映射为1到4个字节的编码序列。
对于汉字而言,通常使用3个字节来表示。
UTF-8的编码规则如下:单字节编码,对于ASCII字符(0x00-0x7F),使用一个字节表示,最高位为0。
多字节编码,对于非ASCII字符,使用多个字节表示,最高位为1,后面的字节都以10开头。
2. UTF-8编码转换为汉字的步骤:如果你有一个UTF-8编码的字节序列,想要将其转换为汉字,可以按照以下步骤进行:首先,将UTF-8编码的字节序列拆分为单个字节。
然后,根据UTF-8的编码规则,将字节序列转换为Unicode 码点。
最后,根据Unicode码点找到对应的汉字字符。
3. 示例代码:如果你使用Python,可以使用以下代码将UTF-8编码转换为汉字:python.utf8_bytes = b'\xe4\xb8\xad\xe6\x96\x87' # UTF-8编码的字节序列。
chinese_str = utf8_bytes.decode('utf-8') # 将字节序列解码为Unicode字符串。
print(chinese_str) # 输出,中文。
4. 其他注意事项:在进行UTF-8编码转换时,需要确保输入的字节序列是有效的UTF-8编码。
否则,可能会导致解码错误或乱码。
如果你是在网页中处理UTF-8编码,可以使用HTML实体或JavaScript的unescape函数对特殊字符进行转义和解码。
总结:UTF-8编码是一种用于表示Unicode字符的编码方式,通过将Unicode字符映射为字节序列,可以实现UTF-8编码转换为汉字。
latin字符编码转换如何进行Latin字符编码转换字符编码是计算机系统中将字符(包括字母、数字和符号)映射为数字的一种方式。
Latin字符编码(也称为ISO-8859)是一种最常用的字符编码方案,用于表示拉丁字母和其他常见字符。
本文将介绍Latin字符编码转换的步骤和方法,帮助读者理解和应用这一编码方案。
下面将一步一步回答这个问题。
第一步:了解Latin字符编码的背景和特点在开始进行Latin字符编码转换之前,我们需要先了解Latin字符编码的背景和特点。
Latin字符编码是ISO/IEC标准序列之一,它定义了一系列字符的编码方式。
最初的版本是ISO-8859-1,也称为Latin-1,它包含了256个字符,包括拉丁字母、西欧语言的符号和其他常用符号。
Latin字符编码的特点在于,它是单字节编码方案,即每个字符只需要一个字节来表示。
这使得Latin字符编码非常适合在计算机系统中存储和传输文本数据。
第二步:确定输入和输出的字符编码方式在进行Latin字符编码转换之前,我们需要确定输入和输出字符编码方式。
例如,我们可能有一个文本文件,其中的字符编码是Unicode(UTF-8或UTF-16),我们希望将其转换为Latin字符编码。
在这种情况下,输入字符编码是Unicode,输出字符编码是Latin字符编码(例如ISO-8859-1)。
确定输入和输出字符编码非常重要,因为它们决定了转换的方式和结果。
如果输入和输出字符编码不匹配,转换结果可能会出现问题。
第三步:选择适当的工具和方法进行转换在进行Latin字符编码转换之前,我们需要选择适当的工具和方法。
常见的转换工具包括文本编辑器、命令行工具和编程语言库。
以下是几种常用的工具和方法。
1. 文本编辑器:许多文本编辑器都支持字符编码转换功能,例如Notepad++、Sublime Text和Visual Studio Code。
通过打开文本文件,并选择合适的字符编码,我们可以将输入字符编码转换为Latin字符编码。
utf8编码互相转换-回复UTF-8编码互相转换是指将文本从UTF-8编码转换为其他编码,或从其他编码转换为UTF-8编码。
UTF-8是一种变长的编码方式,能够表示全球范围内的字符,它在网络传输和存储中被广泛使用。
本文将以UTF-8编码互相转换为主题,一步一步地回答如何进行转换的方法。
首先,我们需要先了解UTF-8编码的基本知识。
UTF-8编码是用于表示Unicode字符的一种变长编码方式,它能够表示从U+0000到U+10FFFF的所有字符。
UTF-8编码使用1到4个字节来表示一个字符,其中ASCII字符(U+0000到U+007F)使用1个字节表示,而其他字符使用2到4个字节表示。
一、将文本从UTF-8编码转换为其他编码:1. 确定目标编码:首先,我们需要确定要将UTF-8编码转换为的目标编码。
常见的目标编码包括UTF-16、UTF-32、GB2312、GBK等。
2. 使用编程语言提供的函数或库:大多数编程语言都提供了函数或库来进行编码转换。
例如,在Python中,可以使用`decode`函数将UTF-8编码的文本转换为其他编码,如下所示:pythonutf8_text = b'\xe4\xbd\xa0\xe5\xa5\xbd' # UTF-8编码的文本target_encoding = 'GBK' # 目标编码decoded_text = utf8_text.decode('utf-8').encode(target_encoding)这里首先使用`decode`函数将UTF-8编码的文本解码为Unicode字符串,然后再使用`encode`函数将Unicode字符串编码为目标编码。
3. 确认转换结果:转换完成后,可以使用目标编码来确认转换结果是否正确。
例如,可以将转换后的文本写入文件或发送到其他系统中,并确保目标系统能够正确解析该文本。
二、将文本从其他编码转换为UTF-8编码:1. 确定原始编码:首先,我们需要确定要将其他编码转换为UTF-8编码的原始编码。
C++字符串完全指南- Win32字符编码(一)前言字符串的表现形式各异,象TCHAR,std::string,BSTR等等,有时还会见到怪怪的用_tcs起头的宏。
这个指南的目的就是说明各种字符串类型及其用途,并说明如何在必要时进行类型的相互转换。
在指南的第一部分,介绍三种字符编码格式。
理解编码的工作原理是致为重要的。
即使你已经知道字符串是一个字符的数组这样的概念,也请阅读本文,它会让你明白各种字符串类之间的关系。
指南的第二部分,将阐述各个字符串类,什么时候使用哪种字符串类,及其相互转换。
字符串基础 - ASCII, DBCS, Unicode所有的字符串类都起源于C语言的字符串,而C语言字符串则是字符的数组。
首先了解一下字符类型。
有三种编码方式和三种字符类型。
第一种编码方式是单字节字符集,称之为SBCS,它的所有字符都只有一个字节的长度。
ASCII码就是SBCS。
SBCS字符串由一个零字节结尾。
第二种编码方式是多字节字符集,称之为MBCS,它包含的字符中有单字节长的字符,也有多字节长的字符。
Windows用到的MBCS只有二种字符类型,单字节字符和双字节字符。
因此Windows中用得最多的字符是双字节字符集,即DBCS,通常用它来代替MBCS。
在DBCS编码中,用一些保留值来指明该字符属于双字节字符。
例如,Shift-JIS(通用日语)编码中,值0x81-0x9F 和 0xE0-0xFC 的意思是:“这是一个双字节字符,下一个字节是这个字符的一部分”。
这样的值通常称为前导字节(lead byte),总是大于0x7F。
前导字节后面是跟随字节(trail byte)。
DBCS的跟随字节可以是任何非零值。
与SBCS一样,DBCS字符串也由一个零字节结尾。
第三种编码方式是Unicode。
Unicode编码标准中的所有字符都是双字节长。
有时也将Unicode称为宽字符集(wide characters),因为它的字符比单字节字符更宽(使用更多内存)。
注意,Unicode不是MBCS - 区别在于MBCS编码中的字符长度是不同的。
Unicode字符串用二个零字节字符结尾(一个宽字符的零值编码)。
单字节字符集是拉丁字母,重音文字,用ASCII标准定义,用于DOS操作系统。
双字节字符集用于东亚和中东语言。
Unicode用于COM和Windows NT内部。
读者都很熟悉单字节字符集,它的数据类型是char。
双字节字符集也使用char数据类型(双字节字符集中的许多古怪处之一)。
Unicode字符集用wchar_t数据类型。
Unicode字符串用L前缀起头,如:wchar_t wch = L'1'; // 2 个字节, 0x0031wchar_t* wsz = L"Hello"; // 12 个字节, 6 个宽字符字符串的存储单字节字符串顺序存放各个字符,并用零字节表示字符串结尾。
例如,字符串"Bob"的存储格式为:Unicode编码中,L"Bob"的存储格式为:用0x0000 (Unicode的零编码)结束字符串。
DBCS 看上去有点象SBCS。
以后我们会看到在串处理和指针使用上是有微妙差别的。
字符串"日本语" (nihongo) 的存储格式如下(用LB和TB分别表示前导字节和跟随字节):注意,"ni"的值不是WORD值0xFA93。
值93和FA顺序组合编码为字符"ni"。
(在高位优先CPU中,存放顺序正如上所述)。
字符串处理函数C语言字符串处理函数,如strcpy(), sprintf(), atol()等只能用于单字节字符串。
在标准库中有只用于Unicode字符串的函数,如wcscpy(), swprintf(), _wtol()。
微软在C运行库(CRT)中加入了对DBCS字符串的支持。
对应于strxxx()函数,DBCS使用_mbsxxx()函数。
在处理DBCS字符串(如日语,中文,或其它DBCS)时,就要用_mbsxxx()函数。
这些函数也能用于处理SBCS字符串(因为DBCS字符串可能就只含有单字节字符)。
现在用一个示例来说明字符串处理函数的不同。
如有Unicode字符串L"Bob":x86 CPU的排列顺序是低位优先(little-endian)的,值0x0042的存储顺序为42 00。
这时如用strlen()函数求字符串的长度就发生问题。
函数找到第一个字节42,然后是00,意味着字符串结尾,于是返回1。
反之,用wcslen()函数求"Bob"的长度更糟糕。
wcslen()首先找到0x6F42,然后是0x0062,以后就在内存缓冲内不断地寻找00 00直至发生一般性保护错(GPF)。
strxxx()及其对应的_mbsxxx()究竟是如何运作的?二者之间的不同是非常重要的,直接影响到正确遍历DBCS字符串的方法。
下面先介绍字符串遍历,然后再回来讨论strxxx()和_mbsxxx()。
字符串遍历我们中的大多数人都是从SBCS成长过来的,都习惯于用指针的++ 和-- 操作符来遍历字符串,有时也使用数组来处理字符串中的字符。
这二种方法对于SBCS 和Unicode 字符串的操作都是正确无误的,因为二者的字符都是等长的,编译器能够的正确返回我们寻求的字符位置。
但对于DBCS字符串就不能这样了。
用指针访问DBCS字符串有二个原则,打破这二个原则就会造成错误。
1. 不可使用++ 算子,除非每次都检查是否为前导字节。
2. 绝不可使用-- 算子来向后遍历。
先说明原则2,因为很容易找到一个非人为的示例。
假设,有一个配制文件,程序启动时要从安装路径读取该文件,如:C:\Program Files\MyCoolApp\config.bin。
文件本身是正常的。
假设用以下代码来配制文件名:bool GetConfigFileName ( char* pszName, size_t nBuffSize ){char szConfigFilename[MAX_PATH];// 这里从注册表读取文件的安装路径,假设一切正常。
// 如果路径末尾没有反斜线,就加上反斜线。
// 首先,用指针指向结尾零:char* pLastChar = strchr ( szConfigFilename, '\0' );// 然后向后退一个字符:pLastChar--;if ( *pLastChar != '\\' )strcat ( szConfigFilename, "\\" );// 加上文件名:strcat ( szConfigFilename, "config.bin" );// 如果字符串长度足够,返回文件名:if ( strlen ( szConfigFilename ) >= nBuffSize )return false;else{strcpy ( pszName, szConfigFilename );return true;}}这段代码的保护性是很强的,但用到DBCS字符串还是会出错。
假如文件的安装路径用日语表达:C:\ヨウユソ,该字符串的内存表达为:这时用上面的GetConfigFileName()函数来检查文件路径末尾是否含有反斜线就会出错,得到错误的文件名。
错在哪里?注意上面的二个十六进制值0x5C(蓝色)。
前面的0x5C是字符"\",后面则是字符值83 5C,代表字符"ソ"。
可是函数把它误认为反斜线了。
正确的方法是用DBCS函数将指针指向恰当的字符位置,如下所示:bool FixedGetConfigFileName ( char* pszName, size_t nBuffSize ){char szConfigFilename[MAX_PATH];// 这里从注册表读取文件的安装路径,假设一切正常。
// 如果路径末尾没有反斜线,就加上反斜线。
// 首先,用指针指向结尾零:char* pLastChar = _mbschr ( szConfigFilename, '\0' );// 然后向后退一个双字节字符:pLastChar = CharPrev ( szConfigFilename, pLastChar );if ( *pLastChar != '\\' )_mbscat ( szConfigFilename, "\\" );// 加上文件名:_mbscat ( szConfigFilename, "config.bin" );// 如果字符串长度足够,返回文件名:if ( _mbslen ( szInstallDir ) >= nBuffSize )return false;else{_mbscpy ( pszName, szConfigFilename );return true;}}这个改进的函数用CharPrev() API 函数将指针pLastChar向后移动一个字符。
如果字符串末尾的字符是双字节字符,就向后移动2个字节。
这时返回的结果是正确的,因为不会将字符误判为反斜线。
现在可以想像到第一原则了。
例如,要遍历字符串寻找字符":",如果不使用CharNext()函数而使用++算子,当跟随字节值恰好也是":"时就会出错。
与原则2相关的是数组下标的使用:2a. 绝不可在字符串数组中使用递减下标。
出错原因与原则2相同。
例如,设置指针pLastChar为:char* pLastChar = &szConfigFilename [strlen(szConfigFilename) - 1]; 结果与原则2的出错一样。
下标减1就是指针向后移动一个字节,不符原则2。
再谈strxxx() 与_mbsxxx()现在可以清楚为什么要用_mbsxxx() 函数了。
strxxx() 函数不认识DBCS字符而_mbsxxx()认识。
如果调用strrchr("C:\\", '\\')函数可能会出错,但_mbsrchr()认识双字节字符,所以能返回指向最后出现反斜线字符的指针位置。
最后提一下strxxx() 和_mbsxxx() 函数族中的字符串长度测量函数,它们都返回字符串的字节数。
如果字符串含有3个双字节字符,_mbslen()将返回6。