wchar_t与char转换

2023-11-10 16:58
文章标签 转换 char wchar

本文主要是介绍wchar_t与char转换,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1\
wchar_t是Unicode用的宽字符类型。用双字表示的字符.汉字字符即为双字。 可以用Win32Api的MultiByteToWideChar/WideCharToMultiByte或C运行库的mbstowcs/wcstombs系列函数对wchar_t* 和 char* 之间进行转换。
a:
wchar_t是unicode字符和char不能直接转换
可用win Api
int MultiByteToWideChar(UINT CodePage, DWORD dwFlags, LPCSTR lpMultiByteStr, int cchMultiByte, LPWSTR lpWideCharStr, int cchWideChar)
转换
b:
要借助于AnsiString与WideString互换;
char *s= "中华人民共和国 ";
wchar *p=Widetring(s).BSTR();
====================================
wchar_t *p=L "中华人民共和国 ";
char *s=AnsiString(p).c_str();
2\
wchar_t与char转换
原文地址:http://hi.baidu.com/gchrist/blog/item/29a138f533383e24bd310934.html

环境:Dev cpp 平台i386
C++标准中,wchar_t是宽字符类型,每个wchar_t类型占2个字节,16位宽。汉字的表示就要用到wchar_t 。char,我们都知道,占一个字节,8位宽。其实知道了这个以后,要在wchar_t 和 char两种类型之间转换就不难实现了。wchar_t 转换为char 的代码如下: 有如下的wchar_t和char变量:wchar_t w_cn = '中'; char c_cn[2] = {'0'} ;
char *C2W(wchar_t w_cn , char c_cn[2])
{ //following code convert wchar to char
c_cn[0] = w_cn >> 8 ;
c_cn[1] = w_cn ;
c_cn[2] = '\0';
return c_cn ;
}
其中需要注意的是一个16位的wchar_t需要用两个8位的char来存储之。我们可以发现另外一个问题,wchar_t的高位字节应该存储在char数组的低位字节。(这里没有仔细研究了,觉得怪怪的)。 这是完成了wchar_t到char的转化,char到wchar_t的转换类似。C++中,你要想这样:cout<<w_cn<<endl;打印wchar_t,那是不行的。why?我想是wchar_t类型没有重载<<运算符吧。要显示,我的方法是:
string cn(c_cn);
cout<<cn<<endl;
这样就能正确的打印wchar_t字符了。是不是感觉好像做了好多事,但是完成的却是很简单的事情?呵呵,其实我也有同感,但是没有办法。更简单的办法,当然是直接用API(我一个是懒的去找了,二一个自己动手转换有些东西看的更清楚咯),但是这样的转换更灵活,
在实际中应该会用到的。 有了以上的基础,下面给出wchar_t字符串到char字符串的转换代码:
char *W2C(const wchar_t *pw , char *pc)
{
//cout<<*pw<<endl; //这样是不能正确显示的,你可以试试看显示的是什么
*pc++ = *pw >> 8 ;
*pc = *pw ;
return 0 ;
}

char *wstr2cstr(const wchar_t *pwstr , char *pcstr, size_t len)
{ char *ptemp = pcstr ;
if(pwstr!=NULL && pcstr!=NULL)
{ size_t wstr_len = wcslen(pwstr) ;
len = (len > wstr_len ) ? wstr_len : len ;
while( len -- > 0)
{
W2C(pwstr , pcstr);
pwstr++ ;
pcstr +=2 ; //和我们开始说的一样+2,不是+1
}
*pcstr = '\0';
return ptemp ;
}
return 0 ;
}

对上面的代码进行测试:
int main(int arg , char *argv[])
{
wchar_t pwstr[] = {'我' , '是' , '中' , '国' , '人'};
char *pcstr = (char *)new char[2 * wcslen(pwstr)+1] ;
memset(pcstr , 0 , 2 * wcslen(pwstr)+1 );
wstr2cstr(pwstr , pcstr , wcslen(pwstr)) ;
str.assign (pcstr);
cout<<str<<endl;
delete []pcstr ;
}

Feedback
# re: [转]wchar_t与char转换 回复 更多评论
2008-01-08 16:40 by <a href=http://minidx.com>minidxer</a>
相同的编码的这样转没问题,不同的话就有问题的
比如gb的转UTF16
# re: [转]wchar_t与char转换 回复 更多评论
2008-01-20 19:41 by jsjkandy
对于编码还刚刚处于学习阶段,不知道您是否可以给我介绍几篇文章,或者给讲一些不同的 编码在不同的平台上进行移植的一些问题。呵呵。
# re: [转]wchar_t与char转换 回复 更多评论
2009-03-02 15:29 by biangji
你好,我在c++中传递char*类型到java的时候出现如下问题
#
# An unexpected error has been detected by Java Runtime Environment:
#
# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x102156f9, pid=5280, tid=5672
#
# Java VM: Java HotSpot(TM) Client VM (11.0-b15 mixed mode, sharing windows-x86)
# Problematic frame:
# C [MSVCR71D.dll+0x156f9]
#
# An error report file with more information is saved as:
# D:\Program Files\eclipse\workspace\jnaTestProject1\hs_err_pid5280.log
#
# If you would like to submit a bug report, please visit:
# http://java.sun.com/webapps/bugreport/crash.jsp
# The crash happened outside the Java Virtual Machine in native code.
# See problematic frame for where to report the bug.
#
不知道是怎么回事,麻烦您解答,谢谢
# re: [转]wchar_t与char转换 回复 更多评论
2009-03-02 15:30 by biangji
不好意思,我发错了
# re: [转]wchar_t与char转换 回复 更多评论
2009-03-05 21:19 by 寒蝉
@biangji
不好意思,呵呵,我java不会啊。
# re: [转]wchar_t与char转换[未登录] 回复 更多评论
2010-10-18 15:51 by me
setlocale...
std::wcout << ..?

这篇关于wchar_t与char转换的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/384032

相关文章

java Long 与long之间的转换流程

《javaLong与long之间的转换流程》Long类提供了一些方法,用于在long和其他数据类型(如String)之间进行转换,本文将详细介绍如何在Java中实现Long和long之间的转换,感... 目录概述流程步骤1:将long转换为Long对象步骤2:将Longhttp://www.cppcns.c

在Java中将XLS转换为XLSX的实现方案

《在Java中将XLS转换为XLSX的实现方案》在本文中,我们将探讨传统ExcelXLS格式与现代XLSX格式的结构差异,并为Java开发者提供转换方案,通过了解底层原理、性能优势及实用工具,您将掌握... 目录为什么升级XLS到XLSX值得投入?实际转换过程解析推荐技术方案对比Apache POI实现编程

Python使用FFmpeg实现高效音频格式转换工具

《Python使用FFmpeg实现高效音频格式转换工具》在数字音频处理领域,音频格式转换是一项基础但至关重要的功能,本文主要为大家介绍了Python如何使用FFmpeg实现强大功能的图形化音频转换工具... 目录概述功能详解软件效果展示主界面布局转换过程截图完成提示开发步骤详解1. 环境准备2. 项目功能结

使用Python实现网页表格转换为markdown

《使用Python实现网页表格转换为markdown》在日常工作中,我们经常需要从网页上复制表格数据,并将其转换成Markdown格式,本文将使用Python编写一个网页表格转Markdown工具,需... 在日常工作中,我们经常需要从网页上复制表格数据,并将其转换成Markdown格式,以便在文档、邮件或

Python将字符串转换为小写字母的几种常用方法

《Python将字符串转换为小写字母的几种常用方法》:本文主要介绍Python中将字符串大写字母转小写的四种方法:lower()方法简洁高效,手动ASCII转换灵活可控,str.translate... 目录一、使用内置方法 lower()(最简单)二、手动遍历 + ASCII 码转换三、使用 str.tr

Java如何将文件内容转换为MD5哈希值

《Java如何将文件内容转换为MD5哈希值》:本文主要介绍Java如何将文件内容转换为MD5哈希值的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java文件内容转换为MD5哈希值一个完整的Java示例代码代码解释注意事项总结Java文件内容转换为MD5

使用Java将实体类转换为JSON并输出到控制台的完整过程

《使用Java将实体类转换为JSON并输出到控制台的完整过程》在软件开发的过程中,Java是一种广泛使用的编程语言,而在众多应用中,数据的传输和存储经常需要使用JSON格式,用Java将实体类转换为J... 在软件开发的过程中,Java是一种广泛使用的编程语言,而在众多应用中,数据的传输和存储经常需要使用j

Java实现视频格式转换的完整指南

《Java实现视频格式转换的完整指南》在Java中实现视频格式的转换,通常需要借助第三方工具或库,因为视频的编解码操作复杂且性能需求较高,以下是实现视频格式转换的常用方法和步骤,需要的朋友可以参考下... 目录核心思路方法一:通过调用 FFmpeg 命令步骤示例代码说明优点方法二:使用 Jaffree(FF

C语言中的常见进制转换详解(从二进制到十六进制)

《C语言中的常见进制转换详解(从二进制到十六进制)》进制转换是计算机编程中的一个常见任务,特别是在处理低级别的数据操作时,C语言作为一门底层编程语言,在进制转换方面提供了灵活的操作方式,今天,我们将深... 目录1、进制基础2、C语言中的进制转换2.1 从十进制转换为其他进制十进制转二进制十进制转八进制十进

Pandas进行周期与时间戳转换的方法

《Pandas进行周期与时间戳转换的方法》本教程将深入讲解如何在pandas中使用to_period()和to_timestamp()方法,完成时间戳与周期之间的转换,并结合实际应用场景展示这些方法的... 目录to_period() 时间戳转周期基本操作应用示例to_timestamp() 周期转时间戳基