软件的一个驱动由于开发的年代比较久一些,使用的是非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. php 命令行方式运行时 几种传入参数的方式

    1. url方式 $param = array(); if ($argc > 1) { parse_str ( $argv [1], $param ); foreach ( $param as ...

  2. centos6.5下使用yum完美搭建LNMP环境(php5.6,mysql5.5,nginx1.10)

    准备工作 配置防火墙,开启80端口.3306端口 不用执行这句:rm -rf /etc/sysconfig/iptables 直接进入修改:vi /etc/sysconfig/iptables 添加8 ...

  3. OpenCV iOS开发(一)——安装(转)

    OpenCV是一个开源跨平台的的计算机视觉和机器学习库,可以用来做图片视频的处理.图形识别.机器学习等应用.本文将介绍OpenCV iOS开发中的Hello World起步. 安装 OpenCV安装的 ...

  4. 工作总结 @Html 辅助方法 为 生成的 标签设置元素属性 htmlAttributes 一个对象,其中包含要为该元素设置的 HTML 特性。

    @Html.RadioButtonFor(m => m.IsJianChe, true, new { @style = "width: 18px; height: 18px;" ...

  5. 转 springboot 监控点 简介

    Spring Boot Actuator监控端点小结  2016-12-24  翟永超  Spring Boot 被围观 7973 次另一篇简单介绍: HTTP://BLOG.720UI.COM/20 ...

  6. mysql create dabase 语法详解

    由于SQL标准的存在,各个关系型数据库管理系统中创建库的语句都差不多 一.mysql 中创建数据库的语法如下: 1.创建数据库的语法: create {database | schema } [if ...

  7. xcode 筛选error

    程序编译出太多warning,想从中找到error很不容易,xcode中可以作筛选,点左下角的叹号即可只显示error:

  8. Linux 指令篇:磁盘管理--tree

    Linux 指令篇:磁盘管理--tree 功能说明:以树状图列出目录的内容. 语 法:tree [-aACdDfFgilnNpqstux][-I <范本样式>][-P <范本样式&g ...

  9. atitit. 研发管理---如何根据自己的特挑选 产业、行业、职业、岗位与自己发展的关系

    atitit. 研发管理---如何根据自己的特挑选 产业.行业.职业.岗位与自己发展的关系 1. 产业及分类 1 2. 二.行业 2 3. 职业概念- 3 4. 职业划分 3 5. 职业兴趣分类 4 ...

  10. javascript递归、循环、迭代、遍历和枚举概念

    javascript递归.循环.迭代.遍历和枚举概念 〓递归(recursion)在数学与计算机科学中,是指在函数的定义中使用函数自身的方法.递归一词还较常用于描述以自相似方法重复事物的过程.例如,当 ...