c/c++用Unicode和UTF8处理中文字符串解决乱码

1. 描述

在windows上做系统编程,少不了会遇到处理中文字符串的问题。而大多时候中文汉字都是以多字节编码的方式展现的。为了实现更好的兼容性或一些特殊的需求,(比如在网页上显示。)常需要将其转换成unicode或者utf8的格式。

2. 代码示例

2.1 中文字符串转Unicode

/************************************************************************
*int CN2Unicode(char *input,wchar_t *output)
*功能:中文字符转换为unicode字符
*参数:input,包含中文的字符串,output,Unicode字符串
*
*************************************************************************/
int CN2Unicode(char *input,wchar_t *output)
{
    int len = strlen(input);

    //wchar_t *out = (wchar_t *) malloc(len*sizeof(wchar_t));

    len=MultiByteToWideChar(CP_ACP,0,input,-1,output,MAX_PATH);

    return 1;
}

2.2 中文字符串转utf8

/************************************************************************
*int CN2Utf8(char *input,char *output)
*功能:中文字符串转换为utf8字符串
*参数:input,包含中文的字符串,output,utf8字符串
*
************************************************************************/
int CN2Utf8(char *input,char *output)
{
    int len ;
    wchar_t *out = (wchar_t *) malloc(len*sizeof(wchar_t));

    len = MultiByteToWideChar(CP_ACP,0,input,-1,out,strlen(input)+1);
    WideCharToMultiByte(CP_UTF8,0,out,wcslen(out),output,len,NULL,NULL);

    return 1;
}

C/C++ Unicode转Utf8,Ansi转Unicode,Ansi文件转Utf8文件

有时候需要把ansi文件内容转换为utf8编码,读取一行之后,把ansi字符串转换为utf8,之后写入文件。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
#include <assert.h>

char* Unicode2Utf8(const char* unicode)
{
    int len;
    len = WideCharToMultiByte(CP_UTF8, 0, (const wchar_t*)unicode, -1, NULL, 0, NULL, NULL);
    char *szUtf8 = (char*)malloc(len + 1);
    memset(szUtf8, 0, len + 1);
    WideCharToMultiByte(CP_UTF8, 0, (const wchar_t*)unicode, -1, szUtf8, len, NULL,NULL);
    return szUtf8;
}

char* Ansi2Unicode(const char* str)
{
    int dwUnicodeLen = MultiByteToWideChar(CP_ACP,0,str,-1,NULL,0);
    if(!dwUnicodeLen)
    {
        return strdup(str);
    }
    size_t num = dwUnicodeLen*sizeof(wchar_t);
    wchar_t *pwText = (wchar_t*)malloc(num);
    memset(pwText,0,num);
    MultiByteToWideChar(CP_ACP,0,str,-1,pwText,dwUnicodeLen);
    return (char*)pwText;
}

char* ConvertAnsiToUtf8(const char* str)
{
    char* unicode = Ansi2Unicode(str);
    char* utf8 = Unicode2Utf8(unicode);
    free(unicode);
    return utf8;
}

int main(int argc, char *argv[])
{
    printf("Hello, world\n");
    //1.构造一个ansi文件,内容是"中文abc",看hex编码.
    //ansi: D6 D0 CE C4 61 62 63
    //utf8: E4 B8 AD E6 96 87 61 62  63
    char ansi[] = {0xD6,0xD0,0xCE,0xC4,0x61,0x62,0x63,0};
    char utf8[] = {0xE4,0xB8,0xAD,0xE6,0x96,0x87,0x61,0x62,0x63,0};
    char* str = ConvertAnsiToUtf8(ansi);
    assert(!strcmp(str,utf8));
    free(str);
    return 0;
}

时间: 2024-10-12 11:35:28

c/c++用Unicode和UTF8处理中文字符串解决乱码的相关文章

js 获取中文标题解决乱码问题

js 获取中文标题解决乱码问题 function gettitle(){     var title;     if (typeof(encodeuricomponent)=="function"){         if (document.title){             if (window.regexp){                 var tire=new regexp("^"+window.location.protocol+"//

解析使用substr截取UTF-8中文字符串出现乱码的问题_php技巧

我们知道有时候使用substr来截取UTF-8中文字符串的时候,经常会出现乱码,为什么会出现这样的问题呢,本文告诉你答案.看这样一段代码吧(字符编码为UTF-8): 复制代码 代码如下: <?$str = '都知道strlen与mb_strlen是求字符串长度的函数';echo strlen($str)'.<br />'.mb_strlen($str,'utf-8');?> 运行上述代码,返回值如下:6634怎么样?strlen中,中文是三个字节的长度,英文则是一个字节的长度!mb

php截取中文字符串不乱码的方法

 利用php内置方法mb_substr截取中文不乱码,使用起来非常简单,大家参考使用吧  GBK编码截取示例   代码如下: $str = '我是谁';  //gbk编码的字符串 echo mb_substr($str, 0, 1, 'gbk'); //输出 我     mb_substr方法比substr多一个参数,用来指定字符串编码.   utf-8编码截取示例   [code] $str = '我abc是谁';  //utf-8编码的字符串 echo mb_substr($str, 0,

中文字符串显示乱码-java前端jquery接接收中文字符串乱码问题

问题描述 java前端jquery接接收中文字符串乱码问题 服务端:@RequestMapping(value="/detail/modSelect", method = {RequestMethod.POST}) public @ResponseBody String mod(@RequestBody String reqParam){ //修改请求处理 System.out.println("修改请求发送到此"); System.out.println(reqP

php截取中文字符串不乱码的方法_php实例

GBK编码截取示例 复制代码 代码如下: $str = '我是谁';  //gbk编码的字符串echo mb_substr($str, 0, 1, 'gbk'); //输出 我 mb_substr方法比substr多一个参数,用来指定字符串编码. utf-8编码截取示例 [code]$str = '我abc是谁';  //utf-8编码的字符串echo mb_substr($str, 0, 2, 'utf-8'); //输出 我a[/code 中英混合也完全没有问题. 友情提示 使用的时候要注意

PHP发送UTF-8编码中文邮件标题乱码的解决

当我们使用下面的PHP语句发送中文电子邮件的时候,会发现邮件的标题是乱码,而邮件正文却是正确的,如何才能使得邮件标题不是乱码呢? $subject = stripslashes($the_post[''Title'']); $headers = "MIME-Version: 1.0rn"; $headers .= "Content-type: text/plain; charset=utf-8rn"; $headers .= "Content-Transf

php中文字符串截取乱码问题解决方法

字符串编码为GB2312的,一个中文字符占两个字节:  代码如下 复制代码 public static function chinesesubstr($str, $start, $len) { // $str指字符串,$start指字符串的起始位置,$len指字符串长度         $strlen = $start + $len; // 用$strlen存储字符串的总长度,即从字符串的起始位置到字符串的总长度         for($i = $start; $i < $strlen;) {

asp.net 中文字符串提交乱码的解决方法_实用技巧

调试的时候发现老是提示用户名不存在.于是我在后台直接输出我传递进去的用户名,发现输出来的全部是乱码.看来是编码的问题,于是百度了一下,发现其实只需要一行语句就能轻松搞定了: 在Web.config中的<system.web>节点里添加如下语句: <globalization requestEncoding="GB2312" responseEncoding="GB2312"/> 然后进系统再调试,搞定...

JS实现对中文字符串进行utf-8的Base64编码的方法(使其与Java编码相同)_javascript技巧

本文实例讲述了JS实现对中文字符串进行utf-8的Base64编码的方法.分享给大家供大家参考,具体如下: 要进行编码的字符串:"select 用户名 from 用户" 使用JAVA进行编码,Java程序: String sql = "select 用户名 from 用户"; String encodeStr = new String(Base64.encode(sql.getBytes("UTF-8"))); // 编码 System.out.