软件的一个驱动由于开发的年代比较久一些,使用的是非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. oracle 存储过程 变量的声明和赋值的3种方式

      oracle 存储过程 变量的声明和赋值的3种方式 CreationTime--2018年8月31日16点00分 Author:Marydon 1.声明变量的3种方式 按照数据类型的声明方式进行区 ...

  2. 【Linux】rmdir命令

    用途 rmdir用于删除空目录 全称 rmdir的全称是:Remove Directory 参数 -p:连同上层空的目录一起删除 案例 现在有文件结构如下 test3 文件夹为空文件夹 test/te ...

  3. 理解Load Average做好压力测试(转)

    转载自:http://www.blogjava.net/cenwenchu/archive/2008/06/30/211712.html SIP的第四期结束了,因为控制策略的丰富,早先的的压力测试结果 ...

  4. MySQL中group_concat函数

    本文通过实例介绍了MySQL中的group_concat函数的使用方法,比如select group_concat(name) .MySQL中group_concat函数完整的语法如下:group_c ...

  5. 阿里云RDS同步到本地自建mysql数据库从库

    RDS mysql版本为5.6.29 x86_64 1.下载数据备份.binlog备份 内网中转?数据量不大,直接下载 下载数据备份(外网下载链接) wget -c "https://rds ...

  6. pageEncoding和ContextType区别

    http://blog.csdn.net/kerrywang/article/details/4454895 pageEncoding        在JSP标准的语法中,如果 pageEncodin ...

  7. T-sql 根据日期时间 按年份、月份、天来统计

    看统计结果: 这里利用的是convert函数,这里不得不说一下convert函数 CONVERT() 函数是把日期转换为新数据类型的通用函数. CONVERT() 函数可以用不同的格式显示日期/时间数 ...

  8. Redis(十八):Redis和队列

    概要 Redis不仅可作为缓存服务器,还可用作消息队列.它的列表类型天生支持用作消息队列.如下图所示: 由于Redis的列表是使用双向链表实现的,保存了头尾节点,所以在列表头尾两边插取元素都是非常快的 ...

  9. AngularJS 中 Provider 的用法及区别

    在一个分层良好的 Angular 应用中,Controller 这一层应该很薄.也就是说,应用里大部分的业务逻辑和持久化数据都应该放在 Service 里. 为此,理解 AngularJS 中的几个 ...

  10. hdu 2066 一个人的旅行(dijkstra)

    一个人的旅行 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Sub ...