软件的一个驱动由于开发的年代比较久一些,使用的是非Unicode编码,而当前新的软件使用的是Unicode编码,于是将非Unicode驱动用于Unicode软件上时,就出现了问题!

  问题就出现在非Unicode与Unicode的转换过程中!

程序中使用了char数组以及TCHAR数组,而数组是以字符‘\0’为结束的。

请看下面的例子:

 C++ Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
 
// cppunicode.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>
#include <string>
#include <tchar.h>
#include <Windows.h>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    char    szArray[MAX_AARRAY_LENGTH];
    TCHAR   tszArray[MAX_AARRAY_LENGTH];
    memset(&szArray, , sizeof(szArray));
    memset(&tszArray, , sizeof(tszArray));
    ; i < MAX_AARRAY_LENGTH; i++)
    {
        )
        {
            szArray[i] = 'a';
        }
        )
        {
            szArray[i] = 'b';
        }

)
        {
            szArray[i] = 'c';
        }
    }

//会被‘\0’截断,然后输出aaaaaaaaaaa
    cout << szArray << endl;
    
    //char[]转TCHAR[] 方法1
) ;  
    MultiByteToWideChar (CP_ACP, , tszArray, nLength) ;

//char[]转TCHAR[] 方法2
; i < MAX_AARRAY_LENGTH; i++)
    {
        TCHAR* ptchar = new TCHAR;
        *ptchar = '\0';
        MultiByteToWideChar(CP_ACP, );  
        tszArray[i] = *ptchar;
        delete ptchar;
    }

//TCHAR[]转char[] 方法1
, NULL, NULL );
    WideCharToMultiByte( CP_ACP, , szArray, nLen, NULL, NULL );

//TCHAR[]转char[] 方法2
; i < MAX_AARRAY_LENGTH; i++)
    {
        char* pchar = new char;
        *pchar = '\0';
        WideCharToMultiByte(CP_ACP, , NULL, NULL );
        szArray[i] = *pchar;
        delete pchar;
    }
    
    //会被‘\0’截断,然后输出aaaaaaaaaaa
    cout << szArray << endl;
    cout << tszArray << endl;

;
}

  char数组szArray的内容如下:可见,在数组长度范围内,分三个位置存储了不同的内容,但是在使用cout输出、sprintf、MultiByteToWideChar以及WideCharToMultiByte等时会将其在索引为12时遇到‘\0’被截断处理,导致只能保留第一部分位置的内容,从而造成数据的截断丢失

  原始数据:

  MultiByteToWideChar转换后的数据:

   我一直希望能够通过库函数以及API来解决此问题,但是它们均是遇到‘\0’则结束转换操作。

一种可行的做法是:遍历字符数组,单个字符转换后,再赋值给新的字符数组(简单好用!)。

见程序中: //char[]转TCHAR[] 方法2     //TCHAR[]转char[] 方法2,从而很好地完成此类字符数组的转换。

char[]与TCHAR[]互相转换引发的一个问题!的更多相关文章

  1. VC++中char和TCHAR之间转换

    char:计算机编程语言(c.c++.java等)中可容纳单个字符的一种基本数据类型. TCHAR:为了满足Unicode编码,对char的扩展,即_T(“str”)表示TCHAR类型 C++支持两种 ...

  2. MySQL字符集转换引发插入乱码问题

    根据http://www.cnblogs.com/cchust/p/4601536.html进行验证测试 问题背景 在mysql上面执行一条普通的insert语句,结果报错: Incorrect st ...

  3. string、wstring、cstring、 char、 tchar、int、dword转换方法(转)

    string.wstring.cstring. char. tchar.int.dword转换方法(转)   最近编程一直头痛这集中类型的转化,明知都可以转却总是记不住,不断的上网查来查去,在这里小结 ...

  4. 转:char*, char[] ,CString, string的转换

    转:char*, char[] ,CString, string的转换 (一) 概述 string和CString均是字符串模板类,string为标准模板类(STL)定义的字符串类,已经纳入C++标准 ...

  5. CString与string、char*的区别和转换

    转自:http://blog.csdn.net/luoweifu/article/details/20232379 我们在C++的开发中经常会碰到string.char*以及CString,这三种都表 ...

  6. char类型的数值转换

    在视频教程中,你已经认识到了数字类型之间.字符串和其他类型之间的转换.而某些时候,我们还需要将char类型转换为int类型,或者把int类型转换为char类型. 这篇文章,将介绍在代码中虽然不太常用, ...

  7. 【转】CString与string、char*的区别和转换

    我们在C++的开发中经常会碰到string.char*以及CString,这三种都表示字符串类型,有很多相似又不同的地方,常常让人混淆.下面详细介绍这三者的区别.联系和转换: 各自的区别 char*: ...

  8. char与TCHAR相互转换(拒绝中文乱码,好用!)

    C++编程中屡屡要遇到宽窄字符转换的问题,尤其是字符串中有中文,稍有不慎就会中文乱码,程序运行出错. 下面为char*.char[]与TCHAR*.TCHAR[]互转的用法,不求花哨,只求好用!请参考 ...

  9. char[],char *,string之间转换

    char []与char *之间转换 char []转char *:直接进行赋值即可 // char[] 转char *char str[] = "lala";char *str1 ...

随机推荐

  1. 揭秘ThreadLocal(转)

    转载自:掘金大闲人柴毛毛博客. ThreadLocal是开发中最常用的技术之一,也是面试重要的考点.本文将由浅入深,介绍ThreadLocal的使用方式.实现原理.内存泄漏问题以及使用场景. Thre ...

  2. Android自定义控件-折线图

    好长时间没有更新博客了,终于可以抽出时间写点东西了,写点什么呢?最近在qq群里边有人问,下边的这个控件怎么画?如下图所示:图可以左右拖动,直到显示完全为止.刚开始看到这个效果图,我也想了一下总共分为以 ...

  3. 对Ubuntu操作系统进行彻底优化

    在安装Linux系统之初,就应该考虑怎样使Linux系统得到最好的性能.Linux本身也设计成可以良好扩展的形态,比如在Linux系统中,我们可以随心所欲地组织磁盘分区,有些朋友喜欢一个/,一个swa ...

  4. 【转帖】如何利用Spring Cloud构建起自我修复型分布式系统

    http://zhidao.baidu.com/link?url=tSKwdn3wr8KUxWMteHmneFtY0KoNZBMK9Xy-RimsdISA4h2neAecgHqggBipz2w6nXr ...

  5. [Asp.net]缓存之页面缓存,控件缓存,缓存依赖

    写在前面 上篇文章介绍了缓存的基本概念及用途,另外也举了一个简单的例子,数据缓存(将一些耗费时间的数据加入到一个对象缓存集合中,以键值的方式存储.可以通过使用Cache.Insert()方法来设置缓存 ...

  6. C# 获取文件MD5、SHA1

    /// <summary> /// 计算文件的 MD5 值 /// </summary> /// <param name="fileName"> ...

  7. mark v1 SecurityConfig

    package cn.efunbox.cms.configuration; import cn.efunbox.afw.core.entity.ApiCode; import cn.efunbox.a ...

  8. (void)0和0的区别及用法

    (void)0相当于宏NULL,NULL本身的含义为“空”,在c语言代表“不存在.不确定”的含义. 0不能简单的理解为“没有”的意思,在c语言及二进制中,0和1代表的是“一件事物的正反两个方面“,0是 ...

  9. UIImageView的一些用法

    转自:http://blog.sina.com.cn/s/blog_60e2dbcf01014bfm.html //初始化 UIImageView  *imageView=[[UIImageView ...

  10. mplayer 全屏问题

    [root@ok home]# gedit ~/.mplayer/config # Write your default config options here! zoom=yes #加上这个参数!全 ...