关于unicode 的问题,~~
各位大虾,谁能给我讲一下, 如何 使用 unicode 开发程序~? 问题点数:50、回复次数:4Top
1 楼BroncoSpeedCoursing(≡野马奔驰≡)回复于 2004-08-03 19:44:11 得分 50
Unicode :宽字节字符集
1. 如何取得一个既包含单字节字符又包含双字节字符的字符串的字符个数?
可以调用Microsoft Visual C++的运行期库包含函数_mbslen来操作多字节(既包括单字节也包括双字节)字符串。
调用strlen函数,无法真正了解字符串中究竟有多少字符,它只能告诉你到达结尾的0之前有多少个字节。
2. 如何对DBCS(双字节字符集)字符串进行操作?
函数 描述
PTSTR CharNext ( LPCTSTR ); 返回字符串中下一个字符的地址
PTSTR CharPrev ( LPCTSTR, LPCTSTR ); 返回字符串中上一个字符的地址
BOOL IsDBCSLeadByte( BYTE ); 如果该字节是DBCS字符的第一个字节,则返回非0值
3. 为什么要使用Unicode?
(1) 可以很容易地在不同语言之间进行数据交换。
(2) 使你能够分配支持所有语言的单个二进制.exe文件或DLL文件。
(3) 提高应用程序的运行效率。
Windows 2000是使用Unicode从头进行开发的,如果调用任何一个Windows函数并给它传递一个ANSI字符串,那么系统首先要将字符串转换成Unicode,然后将Unicode字符串传递给操作系统。如果希望函数返回ANSI字符串,系统就会首先将Unicode字符串转换成ANSI字符串,然后将结果返回给你的应用程序。进行这些字符串的转换需要占用系统的时间和内存。通过从头开始用Unicode来开发应用程序,就能够使你的应用程序更加有效地运行。
Windows CE 本身就是使用Unicode的一种操作系统,完全不支持ANSI Windows函数
Windows 98 只支持ANSI,只能为ANSI开发应用程序。
Microsoft公司将COM从16位Windows转换成Win32时,公司决定需要字符串的所有COM接口方法都只能接受Unicode字符串。
4. 如何编写Unicode源代码?
Microsoft公司为Unicode设计了WindowsAPI,这样,可以尽量减少代码的影响。实际上,可以编写单个源代码文件,以便使用或者不使用Unicode来对它进行编译。只需要定义两个宏(UNICODE和_UNICODE),就可以修改然后重新编译该源文件。
_UNICODE宏用于C运行期头文件,而UNICODE宏则用于Windows头文件。当编译源代码模块时,通常必须同时定义这两个宏。
5. Windows定义的Unicode数据类型有哪些?
数据类型 说明
WCHAR Unicode字符
PWSTR 指向Unicode字符串的指针
PCWSTR 指向一个恒定的Unicode字符串的指针
对应的ANSI数据类型为CHAR,LPSTR和LPCSTR。
ANSI/Unicode通用数据类型为TCHAR,PTSTR,LPCTSTR。
6. 如何对Unicode进行操作?
字符集 特性 实例
ANSI 操作函数以str开头 strcpy
Unicode 操作函数以wcs开头 wcscpy
MBCS 操作函数以_mbs开头 _mbscpy
ANSI/Unicode 操作函数以_tcs开头 _tcscpy(C运行期库)
ANSI/Unicode 操作函数以lstr开头 lstrcpy(Windows函数)
所有新的和未过时的函数在Windows2000中都同时拥有ANSI和Unicode两个版本。ANSI版本函数结尾以A表示;Unicode版本函数结尾以W表示。Windows会如下定义:
#ifdef UNICODE
#define CreateWindowEx CreateWindowExW
#else
#define CreateWindowEx CreateWindowExA
#endif // !UNICODE
7. 如何表示Unicode字符串常量?
字符集 实例
ANSI “string”
Unicode L“string”
ANSI/Unicode T(“string”)或_TEXT(“string”)if( szError[0] == _TEXT(‘J’) ){ }
8. 为什么应当尽量使用操作系统函数?
这将有助于稍稍提高应用程序的运行性能,因为操作系统字符串函数常常被大型应用程序比如操作系统的外壳进程Explorer.exe所使用。由于这些函数使用得很多,因此,在应用程序运行时,它们可能已经被装入RAM。
如:StrCat,StrChr,StrCmp和StrCpy等。
9. 如何编写符合ANSI和Unicode的应用程序?
(1) 将文本串视为字符数组,而不是chars数组或字节数组。
(2) 将通用数据类型(如TCHAR和PTSTR)用于文本字符和字符串。
(3) 将显式数据类型(如BYTE和PBYTE)用于字节、字节指针和数据缓存。
(4) 将TEXT宏用于原义字符和字符串。
(5) 执行全局性替换(例如用PTSTR替换PSTR)。
(6) 修改字符串运算问题。例如函数通常希望在字符中传递一个缓存的大小,而不是字节。这意味着不应该传递sizeof(szBuffer),而应该传递(sizeof(szBuffer)/sizeof(TCHAR)。另外,如果需要为字符串分配一个内存块,并且拥有该字符串中的字符数目,那么请记住要按字节来分配内存。这就是说,应该调用
malloc(nCharacters *sizeof(TCHAR)),而不是调用malloc(nCharacters)。
10. 如何对字符串进行有选择的比较?
通过调用CompareString来实现。
标志 含义
NORM_IGNORECASE 忽略字母的大小写
NORM_IGNOREKANATYPE 不区分平假名与片假名字符
NORM_IGNORENONSPACE 忽略无间隔字符
NORM_IGNORESYMBOLS 忽略符号
NORM_IGNOREWIDTH 不区分单字节字符与作为双字节字符的同一个字符
SORT_STRINGSORT 将标点符号作为普通符号来处理
11. 如何判断一个文本文件是ANSI还是Unicode?
判断如果文本文件的开头两个字节是0xFF和0xFE,那么就是Unicode,否则是ANSI。
12. 如何判断一段字符串是ANSI还是Unicode?
用IsTextUnicode进行判断。IsTextUnicode使用一系列统计方法和定性方法,以便猜测缓存的内容。由于这不是一种确切的科学方法,因此 IsTextUnicode有可能返回不正确的结果。
13. 如何在Unicode与ANSI之间转换字符串?
Windows函数MultiByteToWideChar用于将多字节字符串转换成宽字符串;函数WideCharToMultiByte将宽字符串转换成等价的多字节字符串。
Top
2 楼UPCC(杂食动物)回复于 2004-08-03 19:52:04 得分 0
unicode对应的宏(UNICODE)然后
WCHAR d= L'i';//存放两个字节!Top
3 楼arlalei(小溪)回复于 2004-08-03 19:57:45 得分 0
3x a lotTop
4 楼BroncoSpeedCoursing(≡野马奔驰≡)回复于 2004-08-03 20:08:30 得分 0
作爲一個電腦的多位元組字元表示系統,Unicode 支援世界上所有語言的編碼和轉換。這篇文章說明了 Linux 應用程式中的國際語言支援的重要性,以及設計 Unicode 支援並將之結合到 Linux 應用程式中去的思想。
Unicode 並不只是一個編程工具,它還是一個政治的、經濟的工具。沒有結合世界的語言支援的應用程式通常只能被那些能讀寫 ASCII 所支援語言的個人使用。這使得建立在 ASCII 基礎之上的電腦技術脫離了世界上大部分人。Unicode 允許程式使用世界上任何一種字元集,因此它支援所有語言。
Unicode 讓程式師爲普通人提供用他們本國語言就能使用的軟體。這樣就不用再學一門外語了,而且更容易實現電腦技術社會和財政上的利益。很容易設想,如果用戶必須爲使用因特網瀏覽器而學習烏爾都語的話,您就難以看到電腦在美國的使用。Web 就更不會出現了。
Linux 承擔了對 Unicode 很大程度上的支援。Unicode 支援被嵌入到內核和代碼開發庫中。在很大程度上,使用程式中幾句簡單的命令就能將它們自動的結合到代碼中。
所有現代字元集的基礎都是在 1968 年以 ANSIX3.4 版本出版的美國資訊交換標準碼(American Standard Code for Information Interchange,ASCII)。一個值得注意的例外是在 ASCII 之前定義的 IBM 的擴充的二進位編碼的十進位交換碼(Extended Binary Coded Decimal Information Code,EBCDIC)。ASCII 是一個編碼字元集(coded character set,CCS),換句話說,它是整數到字元表示的映射。ASCII 編碼字元集允許用一個八位元(基於二進位的,用值 0 或 1 表示的)欄位或位元組(2^8 =256)表示 256 個字元。這是一個高度受限的編碼字元集,它不能表示許多不同語言的所有字元(如中文和日文),不能表示科學符號,更不能表示古代文字(神秘符號和象形文字)和音樂符號。通過更改一個位元組的長度而使更大的字元集得以被編碼,這似乎有效但完全不切實際。所有的電腦都基於八位元位元組。解決方法是一種字元編碼方案(Character encoding scheme,CES)— 用定長或變長的多位元組序列能夠表示比 256 大的數.這些數值接著通過編碼字元集被映射到它們表示的字元。
Unicode 的定義
Unicode 通常用作涉及雙位元組字元編碼方案的通用術語。Unicode CCS 3.1 的官方稱謂是 ISO10646-1 通用多八位元組編碼字元集(Universal Multiple Octet Coded Character Set,UCS)。Unicode 3.1 版本添加了 44,946 個新的編碼字元。算上 Unicode 3.0 版本已經存在的 49,194 個字元,共計 94,140 個。
Unicode 編碼字元集利用了一個由 128 個三維的組構成的四維編碼空間。其中每個組包含 256 個二維平面。每個平面由 256 個一維的行組成,並且每個行有 256 個單元。每個單元在這個編碼空間內對一個字元編碼,或者被聲明爲未經使用。這種編碼概念被稱爲 UCS-4;四個八位元用來表示指定組、平面、行和單元的每個字元。
第一個平面(第 00 組的第 00 平面)是基本多語言平面(Basic Multilingual Plane,BMP)。BMP 按字母、音節、表意符號和各種符號及數位定義了常規使用的字元。後續的平面用於附加字元或其他還沒有發明的編碼實體。我們需要這完整的範圍去處理世界上的所有語言;特別是擁有將近 64,000 個字元的一些東亞語言。
BMP 被用作雙位元組的編碼字元集,這種編碼字元集確定爲 ISO 10646 UCS-2 格式。ISO 10646 UCS-2 就是指 Unicode(並且兩者相同)。BMP,像所有 UCS 平面那樣,包含了 256 行,其中每行包含 256 個單元,字元僅僅按照 BMP 中的行和單元的八位元元在單元中被編碼。這就允許 16 位元編碼字元能夠被用來書寫大多數商業上最重要的語言。UCS-2 不需要內碼表切換、代碼擴展或代碼狀態。UCS-2 是一種將 Unicode 結合到軟體中的簡單方法,但它只限於支援 Unicode BMP。
若要用 8 位元位元組表示一個多於 2^8 =256 個字元的字元編碼系統(character coding system,CCS),就需要一種字元編碼方案(character-encoding scheme,CES)。
Unicode 轉換
在 UNIX 中,使用得最多的字元編碼方案是 UTF-8。它考慮到了對整個 Unicode 全部頁和平面的全面支援,而且它仍能正確的識別 ASCII。除了 UTF-8 的其他選擇還有:UCS-4、UTF-16、UTF-7.5、UTF-7、SCSU、HTML 和 JAVA。
Unicode 轉換格式(Unicode Transformation Formats,UTFs)是一種通過映射多位元組編碼中的值來支援 Unicode 的字元編碼方案。本文將分析最流行的格式 — UTF-8 字元編碼系統。
UTF-8
UTF-8 轉換格式正逐步成爲一種占主導地位的交換國際文本資訊的方法,因爲它可以支援世界上所有的語言,而且它還與 ASCII 相容。UTF-8 使用變長編碼。從 0 到 0x7f(127)的字元把自身編碼成單字節,而將值更大的字元編碼成 2 到 6 個位元組。
Top




