`
izuoyan
  • 浏览: 9220673 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

疯狂的wchar_t

阅读更多

疯狂的wchar_t
PS: 我还是改个标题,不改怕被高手们骂死。

去年的这个时候当我决定把所有渲染和支持代码都向d3d10转移的时候,就准备搞定以后多语言的问题,于是义无反顾的选择了unicode。unicode处理中文字符串时候方便多了----至少在windows下是如此。
基于这个出发点,我的xml解析器直接处理的就是unicode文本,而不是常见的utf-8。(注,用记事本保存成unicode编码而不是utf-8,见附图,2008-12-10注)一切都很美好,知道我离开windows。上个礼拜,我需要把程序移植到linux下。在编译完程序后,xml加载器首先就了。gdb跟踪进去发现,竟然我取到的一个字符是负数,当时差点没晕倒。想了好长时间没想明白。楞了一个下午才反应过来sizeof(wchar_t) != 2 .....。除了xml文件,我的文件打包器的name成员是wchar_t。意味着我在windows下打包的文件时候在linux下一定会出问题。
考察了很久,猛然发现gcc有个option叫-fshort_wchar。 激动之,赶快加一个,make clean && make。---结果还是挂! 又让我郁闷了好久,继续gdb。发现wcslen(str)竟然短一半----原来glibc里的wchar_t还是4个字节。看来要使用-fshort_wchar还必须要编译glibc。
没办法,只能判断wchar_t长短来处理了。目前我的做法是准备做一个template,根据sizeof(wchar_t)来选择使用哪个字符串,保存在文件里的字串通通按照ucs-2来处理。并在加载时候来进行ucs-2/ucs-4转换。不敢轻易下决策了。等想一阵再说。看来unicode也不省心啊,家家都有本难念的经。

注:ucs分ucs2和ucs4,就是16bit和32bit的。utf8和utf16/utf32则是编码方式。utf8的anscii码基本和ansi一样。可以使用libiconv来进行各种编码方式之间转化。 编译器里的unicode通常是ucs-2-internal和ucs-4-internal。

附:目前我处理带wchar_t需要保存的结构体。

struct sCDDataEntryItem
{
public:
int m_StartAddr; /*long 4 - byte : FileStartAt */
xcd_data_type m_DataType;
int m_DataCompressedSize;/*long 4 - byte : PackedSize */
int m_DataSize; /*long 4 - byte : FileSize-Without packed */

int m_CompressedRate; /**/
int m_Reserved ; /*long 4 - byte : Reserved */

protected:
unsigned short m_utf16Name[128];

public:

virtual wchar_t* getDataName() = 0;
virtual void ValidateName() = 0;
virtual void SetDataName(const wchar_t* name) = 0;

public:
sCDDataEntryItem()
{
m_StartAddr = 0; /*long 4 - byte : FileStartAt */
m_DataType = xcddt_common;
m_DataCompressedSize = 0;/*long 4 - byte : PackedSize */
m_DataSize = 0; /*long 4 - byte : FileSize-Without packed */

m_CompressedRate = XCOMDOC_NOCOMPRESS; /**/
m_Reserved = 0 ; /*long 4 - byte : Reserved */
memset(m_utf16Name,0,sizeof(unsigned short)*128); /*char 128 - byte : File Name(Readable) */
}
};


template <int UCSTYPE> class T_CDDataEntryItemImp : public sCDDataEntryItem
{
};

template <> class T_CDDataEntryItemImp<2> : public sCDDataEntryItem
{
public:
wchar_t* getDataName()
{
return (wchar_t*)m_utf16Name;
}
void ValidateName()
{

}
void SetDataName(const wchar_t* name)
{
wcscpy( (wchar_t*)m_utf16Name,name);
}
};

template <> class T_CDDataEntryItemImp<4> : public sCDDataEntryItem
{
unsigned int m_ucs4DataName[128];
public:
wchar_t* getDataName()
{
if(sizeof(wchar_t) == 4)
return (wchar_t*)m_ucs4DataName;
}
void ValidateName()
{
XEvol_UCS2ToUCS4(m_utf16Name , m_ucs4DataName,128,128);
}

void SetDataName(const wchar_t* name)
{
wcscpy( (wchar_t*)m_ucs4DataName,name);
XEvol_UCS4ToUCS2(m_ucs4DataName , m_utf16Name ,128,128);

}

T_CDDataEntryItemImp()
{
memset(m_ucs4DataName , 0, sizeof(wchar_t) * 128);
}
};

typedef T_CDDataEntryItemImp<sizeof(wchar_t)> CDDataEntryItemImp;

分享到:
评论

相关推荐

    char与wchar_t互转

    ### C++中char与wchar_t互转方法解析 在C++编程中,字符编码的转换是常见的需求之一,尤其是在处理不同编码格式的文本时。本文将详细介绍如何在C++中实现`char`类型与`wchar_t`类型的互相转换,并通过具体的代码...

    char 转wchar_t 及wchar_t转char

    char 转wchar_t 及wchar_t转char的实现函数及原理说明

    c++ wchar_t处理和socket资料

    在C++编程中,`wchar_t`是一种宽字符类型,用于处理多字节或Unicode字符。它在标准库中被定义为一个不小于`int`的整型类型,通常用来存储单个宽字符,比如UTF-16编码的Unicode字符。`wchar_t`的数据类型在处理非...

    wchar_t*转换为char*

    在C++编程中,`wchar_t` 和 `char` 是两种不同的字符类型,它们分别用于处理宽字符和窄字符。`wchar_t` 通常用于表示多字节字符,如Unicode编码,而 `char` 通常用于ASCII编码。当需要在两者之间进行转换时,必须...

    VC之CString,wchar_t,int,string,char*之间的转换

    `CString`、`wchar_t`、`int`、`string`和`char*`都是编程中常用的字符串和数值类型,它们之间互相转换有助于在不同场景下灵活地处理数据。本篇文章将详细介绍这些类型之间的转换方法。 首先,`CString`是Microsoft...

    VC++中的char,wchar_t,TCHAR

    VC++中的char,wchar_t,TCHAR详解 在VC++中,char、wchar_t和TCHAR是三个非常重要的字符类型,它们之间的区别和使用方法是初学者需要了解的基础知识。下面我们将详细介绍这三个字符类型的概念、用法和区别。 一、...

    char wchar_t 之间的转换程序

    实现char wchar_t 之间的转换程序

    关于char,_wchar_t,_TCHAR,__T(),L,宏__T、TEXT,_TEXT、L.

    在Windows平台上,`_wchar_t` 是等价于`wchar_t` 的类型,而在其他遵循C++标准的系统中,`wchar_t` 通常不带下划线。 3. **`_TCHAR`**: 这是一个预处理器宏,用于提供多字节(MB)或宽字节(WB)字符支持的灵活性。...

    VC++中的char wchar_T和TCHAR

    ### VC++中的char, wchar_T和TCHAR详解 在VC++开发环境中,处理文本数据时,程序员经常会遇到三种字符类型:`char`、`wchar_T` 和 `TCHAR`。这些类型的选择对于确保代码的兼容性和效率至关重要。本文将详细介绍这三...

    cgo.wchar:cgo.wchar包将与gocgo一起使用,并有助于在C.wchar_t和wchar_t字符串之间进行转换(* C.wchar_t具有空终止符或int长度)

    cgo.wchar 帮助在cgo中使用wchars。 例子 go.hid库中的示例: func ( dev * Device ... wchar_t )( ws . Pointer ()), 100 ) if res != 0 { return "" , dev . lastError () } // get WcharString as Go string

    CString、LPCTSTR、LPTSTR、TCHAR、WCHAR、string、wchar_t、char解析

    本文将深入解析几种常见的字符串类型,包括`CString`、`LPCTSTR`、`LPTSTR`、`TCHAR`、`WCHAR`、`string`、`wchar_t`和`char`。 1. `CString`:`CString`是Microsoft MFC(Microsoft Foundation Classes)库中定义...

    深入理解c++中char*与wchar_t*与string以及wstring之间的相互转换

    代码如下: #ifndef USE_H_ #define USE_H_ #include  #include  #include  using namespace std; class CUser { public: CUser();... char* WcharToChar(const wchar_t* wp); char* StringToChar

    关于char的前后兼容问题

    `wchar_t` 的实际定义位于 `&lt;wchar.h&gt;` 头文件中,并被定义为 `typedef unsigned short wchar_t;`。这意味着每个 `wchar_t` 占用 2 个字节的空间。例如: ```c++ wchar_t wc = L'A'; // 定义一个宽字符 wchar_t*...

    wchar_t,char,string,wstring之间的相互转换

    在处理中文时有时需要进行wchar_t,char,string,wstring之间的转换。 其中char和string之间、wchar_t和wstring之间的转换较为简单,代码在vs2010下测试通过。 代码如下:#include &lt;iostream&gt;#include &lt;string&gt;#...

    浅谈c++ 字符类型总结区别wchar_t,char,WCHAR

    1、区别wchar_t,char,WCHAR ANSI:即 char,可用字符串处理函数:strcat( ),strcpy( ), strlen( )等以str打头的函数。 UNICODE:wchar_t是Unicode字符的数据类型,它实际定义在里: typedef unsigned short wchar_t;...

    读写ini配置文件中的简体中文(支持GB2312、GBK和GB18030编码)

    这个DLL提供支持读取写ini文件中简体中文内容的功能,c语言原型如下:BOOL WINAPI GetProfileGb18030String(const wchar_t* filename, const wchar_t *section, const wchar_t *key, wchar_t *resultstr, size_t ...

    C++char无法转为LPCWSTR的解决方法收集。

    C++中char无法转换为LPCWSTR是由于类型不兼容引起的,LPCWSTR类型是const wchar_t *,而const char[]是const char *,因此不能隐式转换。在VS2010开发平台中,默认情况下使用Unicode字符集,而在VC6.0中默认使用...

    让开源项目TinyXml支持Unicode(wchar_t)

    1. TinyXml函数调用接口的字符型参数,仅支持`窄字符`格式(char*),不兼容`宽字符`格式(wchar_t*)。 2. TinyXml函数提供的Xml内容解析功能,仅支持以ANSI编码和UTF8编码的Xml字符串,也即`多字节编码`。 3. Tiny...

Global site tag (gtag.js) - Google Analytics