unicode韩文转char乱码问题

树下 2013-09-04 06:27:23
遇到一个问题,unicode韩文用WideCharToMultiByte()函数转为char后出现乱码,中文、日文...就没有这方面的问题,这是什么原因呀……
...全文
721 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
CrazyBW 2014-02-13
  • 打赏
  • 举报
回复
引用 18 楼 zhuzhucong 的回复:
第一个参数如果为UTF-8,那不仅是韩文乱码,中文……也都乱了
在编译器里面看是乱的,但实际上机器是能正确解释的,刚刚用文件测试了下,第一个参数使用UTF8是对的
onlyhuiyi 2013-09-07
  • 打赏
  • 举报
回复
不是吧。。多字节字符串。。
树下 2013-09-07
  • 打赏
  • 举报
回复
有什么问题吗
赵4老师 2013-09-06
  • 打赏
  • 举报
回复
对电脑而言没有乱码,只有二进制字节;对人脑才有乱码。啊 GBK:0xB0 0xA1,Unicode:0x4A 0x55,UTF-8:0xE5 0x95 0x8A
树下 2013-09-06
  • 打赏
  • 举报
回复
感谢各位网友的回复,我想问题应该是VS工程字符集设置的问题,原来的设置是多字节,现改为Unicode。
飞天狐213 2013-09-05
  • 打赏
  • 举报
回复
你把代码贴出来啊。那个WideCharToMultiByte()函数的第一个参数有没有设置为utf8?
树下 2013-09-05
  • 打赏
  • 举报
回复
这段代码显然不是符合我的情况呀
lpcads 2013-09-05
  • 打赏
  • 举报
回复
有多种可能。
w2m函数中codepage参数错误。
操作系统cp设置问题,如果是w2m,应换韩文cp。

如果单纯为了输出显示,那还是用unicode吧,没必要转
赵4老师 2013-09-05
  • 打赏
  • 举报
回复
#pragma comment(lib,"user32")
#pragma comment(lib,"gdi32")
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
HWND WINAPI GetConsoleWindow();
void HideTheCursor() {
    CONSOLE_CURSOR_INFO cciCursor;
    HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);

    if(GetConsoleCursorInfo(hStdOut, &cciCursor)) {
        cciCursor.bVisible = FALSE;
        SetConsoleCursorInfo(hStdOut, &cciCursor);
    }
}
void ShowTheCursor() {
    CONSOLE_CURSOR_INFO cciCursor;
    HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);

    if(GetConsoleCursorInfo(hStdOut, &cciCursor)) {
        cciCursor.bVisible = TRUE;
        SetConsoleCursorInfo(hStdOut, &cciCursor);
    }
}
int main() {
    HWND  hwnd;
    HDC   hdc;
    HFONT hfont;

    system("color F0");
    system("cls");
    HideTheCursor();
    hwnd  = GetConsoleWindow();
    hdc   = GetDC(hwnd);
    hfont = CreateFont(48, 0, 0, 0, 0, 0, 0, 0, 0             , 0, 0, 0, 0, "Arial Unicode MS");
    SelectObject(hdc,hfont);
    TextOutW(hdc,10,10,L"你好",2);
    DeleteObject(hfont);
    hfont = CreateFont(48, 0, 0, 0, 0, 0, 0, 0, JOHAB_CHARSET , 0, 0, 0, 0, "Arial Unicode MS");
    SelectObject(hdc,hfont);
    TextOutW(hdc,10,80,L"\xb7f0\xb7f0\xb2dd\xb2dd",4);
    DeleteObject(hfont);
    ReleaseDC(hwnd,hdc);
    getch();
    system("color 07");
    system("cls");
    ShowTheCursor();
    return 0;
}
lpcads 2013-09-05
  • 打赏
  • 举报
回复
引用 18 楼 zhuzhucong 的回复:
第一个参数如果为UTF-8,那不仅是韩文乱码,中文……也都乱了
那没办法了,要想在同一页面显示中文和韩文,非unicode方案的话,反正gb2312和gbk基本误解。不知道是否有哪些字符集支持,但那个控件又未必支持。 PS:系统显示韩语很正常是因为windows是基于unicode的,显示什么unicode字符当然都没问题。
树下 2013-09-05
  • 打赏
  • 举报
回复
我是在用COM编程,函数的参数是BSTR类型,也就是wchat_t*,我在函数内部要进行unicode到char的转换,以便显示在界面上,那个BSTR参数有可以同时包含各种字符,韩文、中文、日文、英文.....,用函数转换后就只有韩文会出现乱码,其余语言正常,用的转换代码页是CP_ACP...
树下 2013-09-05
  • 打赏
  • 举报
回复
第一个参数如果为UTF-8,那不仅是韩文乱码,中文……也都乱了
树下 2013-09-05
  • 打赏
  • 举报
回复
补充下,那个参数字符串是要显示中控件上的,那个控件提供的显示接口参数就是LPCSTR(也就是const char * ).....
树下 2013-09-05
  • 打赏
  • 举报
回复
看来先上代码,再解释下

void class_name::someFunc(BSTR title)
{
int len = ::WideCharToMultiByte(CP_ACP,NULL,title,-1,NULL,0,NULL,NULL);
char * tmp = new char[len+1];
::memset(tmp,0,len+1);
::WideCharToMultiByte(CP_ACP ,NULL,title,-1,tmp,len+1,NULL,NULL);
//..........
delete [] tmp;
//以下..............



这上函数大体是这样,传进来的是BSTR(也就是wchat_t *)参数,假如传进来的是一个网站标题,这个标题串里有韩文,日文,中英文,调试时发现用WideCharToMultiByte()转换后w仅仅就韩文出现了乱码(????..),查看内存(tmp数组中)就是乱码了。
这个代码页我指定的是CP_ACP,因为我并不知道程序运时那个参数字符串会包含什么语言的字符,不大可能单独是某种语言的。
至于韩语语言包肯定是有的,因为系统时显示韩语很正常。
zhao4chong1提到的创建字体问题,应该和我这个没有多联系,因为是在转换后立马出现乱码,并不是在显示在控制上时出现乱码的。
lpcads 2013-09-05
  • 打赏
  • 举报
回复
引用 14 楼 lpcads 的回复:
[quote=引用 7 楼 zhuzhucong 的回复:] 我是在用COM编程,函数的参数是BSTR类型,也就是wchat_t*,我在函数内部要进行unicode到char的转换,以便显示在界面上,那个BSTR参数有可以同时包含各种字符,韩文、中文、日文、英文.....,用函数转换后就只有韩文会出现乱码,其余语言正常,用的转换代码页是CP_ACP...
我好像明白了。lz是不是要utf16转utf8呀,如果不是uncode编码,是无法在同一页正常显示各国语言的。 不能用cp_acp,应用utf8的那个[/quote] 英文和日文正常是因为gb2312里包含英文和日文字符,但不包含韩文字符。 看百科 GB 2312标准共收录6763个汉字,其中一级汉字3755个,二级汉字3008个;同时,GB 2312收录了包括拉丁字母、希腊字母、日文平假名及片假名字母、俄语西里尔字母在内的682个全角字符。 所以如果要在同一页面显示中文和韩文,应该使用unicode编码,utf16或utf8 。 如果是unicode转utf8,w2m函数应使用CP_UTF8参数。
lpcads 2013-09-05
  • 打赏
  • 举报
回复
引用 7 楼 zhuzhucong 的回复:
我是在用COM编程,函数的参数是BSTR类型,也就是wchat_t*,我在函数内部要进行unicode到char的转换,以便显示在界面上,那个BSTR参数有可以同时包含各种字符,韩文、中文、日文、英文.....,用函数转换后就只有韩文会出现乱码,其余语言正常,用的转换代码页是CP_ACP...
我好像明白了。lz是不是要utf16转utf8呀,如果不是uncode编码,是无法在同一页正常显示各国语言的。 不能用cp_acp,应用utf8的那个
赵4老师 2013-09-05
  • 打赏
  • 举报
回复
开始、运行:charmap
赵4老师 2013-09-05
  • 打赏
  • 举报
回复
引用 11 楼 truexf 的回复:
确认两点: 1. widechartomultibyte函数的第一个参数是不是 1361(韩语代码页) 2. 你的系统有没有安装韩语语言包
最后确认两点: 1.你调用CreateFont创建字体时用的字体里面有没有CharSet:JOHAB_CHARSET对应的字符。 2.你调用CreateFont创建字体时fdwCharSet参数是否用了JOHAB_CHARSET。 CreateFont The CreateFont function creates a logical font that has specific characteristics. The logical font can subsequently be selected as the font for any device. HFONT CreateFont( int nHeight, // logical height of font int nWidth, // logical average character width int nEscapement, // angle of escapement int nOrientation, // base-line orientation angle int fnWeight, // font weight DWORD fdwItalic, // italic attribute flag DWORD fdwUnderline, // underline attribute flag DWORD fdwStrikeOut, // strikeout attribute flag DWORD fdwCharSet, // character set identifier DWORD fdwOutputPrecision, // output precision DWORD fdwClipPrecision, // clipping precision DWORD fdwQuality, // output quality DWORD fdwPitchAndFamily, // pitch and family LPCTSTR lpszFace // pointer to typeface name string );
「已注销」 2013-09-05
  • 打赏
  • 举报
回复
确认两点: 1. widechartomultibyte函数的第一个参数是不是 1361(韩语代码页) 2. 你的系统有没有安装韩语语言包
kdkdvsq 2013-09-04
  • 打赏
  • 举报
回复
你是在中文版windows上宽字节转多字节(韩文,中文,英文)? 你是在界面上显示文字么? 换个字体试试,我记得在中文windows下有2个韩文字体是在界面上可以直接显示的
加载更多回复(3)

64,646

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧