曾经碰到一个问题,
项目需要支持日文操作系统,但是没有编译成unicode程序。
然后在一个解析用户输入路径的地方出问题了。
原因是日文的"表"这个汉字,日文编码格式下,低字节和反斜杠'/'编码一样,解析的时候把它当成路径的分隔符了。:-(
// 項: 8D 80 (Shift_JIS)
// 目: 96 DA (Shift_JIS)
// 表: 95 5C (Shift_JIS)
// /: 5C (Shift_JIS)
反思一下,如果要支持国际化,最正确也最简单的办法是都编译成Unicode程序。
当然这样就很有可能需要进行些字符集的转换,整理了4个函数。
还可以组合使用,比如要多字节字符串-->UTF8格式字符串,可以调用1)+3)。
1)当前系统编码的多字节字符串-->Unicode格式字符串
2)Unicode格式字符串-->当前系统编码的多字节字符串
3)Unicode格式字符串-->UTF8格式字符串
4)UTF8格式字符串-->Unicode格式字符串
补充1)
_UNICODE vs UNICODE
在学习UNICODE的过程中发现有两种关于UNICODE的宏定义: UNICODE和_UNICODE.
UNICODE:
这个宏主要是在Windows SKD中使用, 比如GetWindowText(), 定义了UNICODE以后将被定义为GetWindowTextW(UNICODE版本),否则被定义成GetWindowTextA(ANSI版本).
_UNICODE:
该宏一般用在C运行时库和MFC头文件中, 这时候函数_tcslen()将被映射为wcslen(), 反之被映射为strlen(). 至于在MFC中, 一般存在如下的定义:
#ifdef _UNICODE
#ifndef UNICODE
#define UNICODE
#endif
#endif
#ifdef UNICODE
#ifndef _UNICODE
#define _UNICODE
#endif
#endif
所以在MFC使用哪个都可以.
总结:两个都用上总不会有错的:)
补充2)
VC6中为了编译Unicode软件出了需要添加_UNICODE宏定义外,还需要增加一步:指定程序的入口位置。
否则程序将会发生如下错误:error LNK2001: unresolved external symbol _WinMain@16。
解决办法:在Project Settings > Entry-point symbol编辑框中输入wWinMainCRTStartup。
补充3)
C++比Unicode出生得早,所以最开始没有考虑Unicode支持,char类型是单字节的。
wchar_t实际上是typedef定义。
所以特别要注意防止下面错误。
CString sText = _T("123456789");
int nLength = sText.getLength() //i=9
CFile cFile;
......
cFile.Write(sText,sText.getLength());
这段代码再普通不过了,编译也不会有任何问题。但是实际上输出的内容将会是错误的。正确的代码应该如下:
CString sText = _T("123456789");
int nLength = sText.getLength() //i=9
CFile cFile;
......
cFile.Write(sText,sText.getLength()×sizeof(_TCHAR));
补充4)
Java设计的时候已经考虑了对unicode的支持,所以Java的char类型占用2个字节。
Java中如果要进行字符集转换就简单多了,写了个程序测试了一下。
分享到:
相关推荐
关于GBK和Unicode字符集转换乱码问题
Unicode 字符集的转换
unicode 字符集 与 多字节字符集转换/kekegeneral
unicode字符转换工具,在UI开发中会比较有用!
在VS2008中,默认的字符集形式是Unicode,但在VC6.0等工程中,默认的字符集形式是多...这里总结了在VS2008环境中 Unicode字符集下CString和char *之间相互转换的几种方法,其实也就是Unicode字符集与MBCS字符集转换。
众多字符集编码的区别Unicode向GB2312转换方法说明及包括ASCII码部分及GB2312字符集。 ASCII码部分为128个字符,GB2312字符集为7445个字符。 ASCII码部分不需要用映射表。 GB2312 table可分为4段,每段都是连续的。...
UnicodeConv 3.0.0 Unicode Converter Library 3.0.0 Delphi 3/4/5/6/7 and Kylix Implementation
MFC在unicode字符集下的多字节串口调试助手,涉及到了MFC在unicode编码和多字节编码之间的转换,所用的编译器为VS2013,可以直接在VS2013中运行
各类编码转换,从unicode 到 Shift-JIS
Unicode字符集,Unicode(统一码、万国码、单一码)是一种在计算机上使用的字符编码。它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。1990年开始研发,...
[字符集]Unicode和UTF-8之间的转换详解
多种字符集转换代码。 UTF8ToGBK Unicode2GBString UTF8ToGBString
当vs2013只支持unicode字符集,打开vc6.0版本的工程后,需要把字符串的形式从 "aaa" 转换成 _T("aaa"),手工转换工作量大,本程序可实现批量转换,操作方法是将原文件内容复制过来,点击转换按钮,然后再复制回去即可...
编码包含的是中文,英文,俄文还是日文什么的,只要把它转换成Unicode就能被识别,而不用再考虑其他字符集的问题,UTF8是Unicode得一种实现方式。 unicode编码(UTF8)的十六进制 与字符 互相转换
在以前用VC++ 编写程序的时候,没有注意以后采用Unicode字符集,程序中出现的大量字符串需要添加 _T()才能正常编译,这是一个很庞大的工作,因此自己写了一个工具来实现自动转换,在使用时请您首先备份自己的代码...
在VS2008中,默认的字符集形式是Unicode,但在VC6.0等工程中,默认的字符集形式是多...这里总结了在VS2008环境中 Unicode字符集下CString和char *之间相互转换的几种方法,其实也就是Unicode字符集与MBCS字符集转换。
PowerBuilder9.0开发环境下,可以把UTF-8的编码转换为Unicode的编码格式,在pb9.0环境下测试通过。
unicode字符集下编写多字节的串口调试助手,涉及到了unicode和多字节之间的转换
将UNICODE字符集与UTF-8字符集相互转换
当需要对一个unicode十六进制字符串进行编码时,首先做的应该是确认字符集编码格式,在无法快速获知的情况下,通过一下的str4all方法可以达到这一目的