如何读取UNICODE编码的TXT文件并显示出内容里的中文字符串

时间:2021-04-19 07:35:40

//读取TXT可编码是UNICODE的时候显示不出中文
wstring s;
wstring x;
wifstream input;    
vector<wstring> vec;

wchar_t out;


input.open(filename,ios::in );

if(input.fail())
{
   cout << "打开文件失败!" << endl;
}


while(!input.eof())//获取全部内容进vec容器中
{
 

getline(input, s);//这里出现乱码

vec.push_back(s);
}





x=vec[0]; 

for(int i=0;i<x.size();i++)
{
out=x[i];
wcout<<out;  //一片漆黑,也就是说中文出不来。英文可以,但是有空格。
}


//************************
输出
w o s h i y i g e b i n g

原来
woshiyigebing


10 个解决方案

#1


for(int i=0;i<x.size();i++)
{
out=x[i];
wcout<<out;  //一片漆黑,也就是说中文出不来。英文可以,但是有空格。
}
 
不需要循环呀

#2


#include <stdio.h>
#include <WCHAR.h>
#include <Windows.h>
//windows默认是GBK码显示的,所以出现乱码;

 char* ToGBK(unsigned int ucode/*unicode码,为四个字节*/){

char* Unicode_char=new char[5];                   
wsprintf(Unicode_char,"%wc",(wchar_t)ucode);              
return Unicode_char;//返回gbk码
}
void main(){
/*
0X4E00为汉字 "一"的UNICODE码;
0XD2BB为汉字"一"GBK码

0X963f为汉字"阿"的UNICODE码;
0XB0A2为汉字"阿"GBK码
 */
char *ch;
ch=ToGBK(0X4E00);
printf(ch);
unsigned char low=*ch;//取汉字对应的内存数据
unsigned char high=*(ch+1);
printf("%02X %02X ",low,high);//gbk码
delete ch;
ch=NULL;

}

楼主可看下ToGBK这个函数;应该可以解决你的那个问题,我之前也遇到楼主类似的问题,现在把函数翻出来供上,有问题可留言

#3


对电脑而言没有乱码,只有二进制字节;对人脑才有乱码。啊 GBK:0xB0 0xA1,Unicode-16 LE:0x4A 0x55,Unicode-16 BE:0x55 0x4A,UTF-8:0xE5 0x95 0x8A

推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。

电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址;
人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……

#4


引用 2 楼 zhangyonghui2117 的回复:
#include <stdio.h>
#include <WCHAR.h>
#include <Windows.h>
//windows默认是GBK码显示的,所以出现乱码;

 char* ToGBK(unsigned int ucode/*unicode码,为四个字节*/){

char* Unicode_char=new char[5];                   
wsprintf(Unicode_char,"%wc",(wchar_t)ucode);              
return Unicode_char;//返回gbk码
}
void main(){
/*
0X4E00为汉字 "一"的UNICODE码;
0XD2BB为汉字"一"GBK码

0X963f为汉字"阿"的UNICODE码;
0XB0A2为汉字"阿"GBK码
 */
char *ch;
ch=ToGBK(0X4E00);
printf(ch);
unsigned char low=*ch;//取汉字对应的内存数据
unsigned char high=*(ch+1);
printf("%02X %02X ",low,high);//gbk码
delete ch;
ch=NULL;

}

楼主可看下ToGBK这个函数;应该可以解决你的那个问题,我之前也遇到楼主类似的问题,现在把函数翻出来供上,有问题可留言


我已经查出了是getline不支持宽字节,有可替代的函数吗?还是说用C语言?但是怎么把Wifstream的转到C语言的FILE?

#5


In Visual C++ 2005, fopen supports Unicode file streams. A flag specifying the desired encoding may be passed to fopen when opening a new file or overwriting an existing file, like this:

fopen("newfile.txt", "rw, ccs=<encoding>");

Allowed values of the encoding include UNICODE, UTF-8, and UTF16-LE. If the file is already in existence and is opened for reading or appending, the Byte Order Mark (BOM) is used to determine the correct encoding. It is not necessary to specify the encoding with a flag. In fact, the flag will be ignored if it conflicts with the type of the file as indicated by the BOM. The flag is only used when no BOM is present or if the file is a new file. The following table summarizes the modes used in for various flags given to fopen and Byte Order Marks used in the file.

Encodings Used Based on Flag and BOM
Flag     | No BOM (or new file) | BOM: UTF-8 | BOM: UTF-16
---------+----------------------+------------+------------
UNICODE  | ANSI                 | UTF-8      | UTF-16LE
UTF-8    | UTF-8                | UTF-8      | UTF-16LE
UTF-16LE | UTF-16LE             | UTF-8      | UTF-16LE

#6


In Visual C++ 2005, fopen supports Unicode file streams. A flag specifying the desired encoding may be passed to fopen when opening a new file or overwriting an existing file, like this:

fopen("newfile.txt", "rw, ccs=<encoding>");

Allowed values of the encoding include UNICODE, UTF-8, and UTF16-LE. If the file is already in existence and is opened for reading or appending, the Byte Order Mark (BOM) is used to determine the correct encoding. It is not necessary to specify the encoding with a flag. In fact, the flag will be ignored if it conflicts with the type of the file as indicated by the BOM. The flag is only used when no BOM is present or if the file is a new file. The following table summarizes the modes used in for various flags given to fopen and Byte Order Marks used in the file.

Encodings Used Based on Flag and BOM
Flag     | No BOM (or new file) | BOM: UTF-8 | BOM: UTF-16
---------+----------------------+------------+------------
UNICODE  | ANSI                 | UTF-8      | UTF-16LE
UTF-8    | UTF-8                | UTF-8      | UTF-16LE
UTF-16LE | UTF-16LE             | UTF-8      | UTF-16LE

#7


In Visual C++ 2005, fopen supports Unicode file streams. A flag specifying the desired
encoding may be passed to fopen when opening a new file or overwriting an existing file,
like this:

fopen("newfile.txt", "rw, ccs=<encoding>");

Allowed values of the encoding include UNICODE, UTF-8, and UTF16-LE. If the file is
already in existence and is opened for reading or appending, the Byte Order Mark (BOM)
is used to determine the correct encoding. It is not necessary to specify the encoding
with a flag. In fact, the flag will be ignored if it conflicts with the type of the
file as indicated by the BOM. The flag is only used when no BOM is present or if the
file is a new file. The following table summarizes the modes used in for various flags
given to fopen and Byte Order Marks used in the file.

Encodings Used Based on Flag and BOM
Flag     | No BOM (or new file) | BOM: UTF-8 | BOM: UTF-16
---------+----------------------+------------+------------
UNICODE  | ANSI                 | UTF-8      | UTF-16LE
UTF-8    | UTF-8                | UTF-8      | UTF-16LE
UTF-16LE | UTF-16LE             | UTF-8      | UTF-16LE

#8


不行,无论怎么getline都是乱码,我用C++的 宽字符读行函数可以读取中文,但是C++里好像没有可以支持的函数

#9


老婆老婆老婆来了

#10


引用 8 楼 nabasasun 的回复:
不行,无论怎么getline都是乱码,我用C++的 宽字符读行函数可以读取中文,但是C++里好像没有可以支持的函数

试试wcin.getline()

#1


for(int i=0;i<x.size();i++)
{
out=x[i];
wcout<<out;  //一片漆黑,也就是说中文出不来。英文可以,但是有空格。
}
 
不需要循环呀

#2


#include <stdio.h>
#include <WCHAR.h>
#include <Windows.h>
//windows默认是GBK码显示的,所以出现乱码;

 char* ToGBK(unsigned int ucode/*unicode码,为四个字节*/){

char* Unicode_char=new char[5];                   
wsprintf(Unicode_char,"%wc",(wchar_t)ucode);              
return Unicode_char;//返回gbk码
}
void main(){
/*
0X4E00为汉字 "一"的UNICODE码;
0XD2BB为汉字"一"GBK码

0X963f为汉字"阿"的UNICODE码;
0XB0A2为汉字"阿"GBK码
 */
char *ch;
ch=ToGBK(0X4E00);
printf(ch);
unsigned char low=*ch;//取汉字对应的内存数据
unsigned char high=*(ch+1);
printf("%02X %02X ",low,high);//gbk码
delete ch;
ch=NULL;

}

楼主可看下ToGBK这个函数;应该可以解决你的那个问题,我之前也遇到楼主类似的问题,现在把函数翻出来供上,有问题可留言

#3


对电脑而言没有乱码,只有二进制字节;对人脑才有乱码。啊 GBK:0xB0 0xA1,Unicode-16 LE:0x4A 0x55,Unicode-16 BE:0x55 0x4A,UTF-8:0xE5 0x95 0x8A

推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。

电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址;
人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……

#4


引用 2 楼 zhangyonghui2117 的回复:
#include <stdio.h>
#include <WCHAR.h>
#include <Windows.h>
//windows默认是GBK码显示的,所以出现乱码;

 char* ToGBK(unsigned int ucode/*unicode码,为四个字节*/){

char* Unicode_char=new char[5];                   
wsprintf(Unicode_char,"%wc",(wchar_t)ucode);              
return Unicode_char;//返回gbk码
}
void main(){
/*
0X4E00为汉字 "一"的UNICODE码;
0XD2BB为汉字"一"GBK码

0X963f为汉字"阿"的UNICODE码;
0XB0A2为汉字"阿"GBK码
 */
char *ch;
ch=ToGBK(0X4E00);
printf(ch);
unsigned char low=*ch;//取汉字对应的内存数据
unsigned char high=*(ch+1);
printf("%02X %02X ",low,high);//gbk码
delete ch;
ch=NULL;

}

楼主可看下ToGBK这个函数;应该可以解决你的那个问题,我之前也遇到楼主类似的问题,现在把函数翻出来供上,有问题可留言


我已经查出了是getline不支持宽字节,有可替代的函数吗?还是说用C语言?但是怎么把Wifstream的转到C语言的FILE?

#5


In Visual C++ 2005, fopen supports Unicode file streams. A flag specifying the desired encoding may be passed to fopen when opening a new file or overwriting an existing file, like this:

fopen("newfile.txt", "rw, ccs=<encoding>");

Allowed values of the encoding include UNICODE, UTF-8, and UTF16-LE. If the file is already in existence and is opened for reading or appending, the Byte Order Mark (BOM) is used to determine the correct encoding. It is not necessary to specify the encoding with a flag. In fact, the flag will be ignored if it conflicts with the type of the file as indicated by the BOM. The flag is only used when no BOM is present or if the file is a new file. The following table summarizes the modes used in for various flags given to fopen and Byte Order Marks used in the file.

Encodings Used Based on Flag and BOM
Flag     | No BOM (or new file) | BOM: UTF-8 | BOM: UTF-16
---------+----------------------+------------+------------
UNICODE  | ANSI                 | UTF-8      | UTF-16LE
UTF-8    | UTF-8                | UTF-8      | UTF-16LE
UTF-16LE | UTF-16LE             | UTF-8      | UTF-16LE

#6


In Visual C++ 2005, fopen supports Unicode file streams. A flag specifying the desired encoding may be passed to fopen when opening a new file or overwriting an existing file, like this:

fopen("newfile.txt", "rw, ccs=<encoding>");

Allowed values of the encoding include UNICODE, UTF-8, and UTF16-LE. If the file is already in existence and is opened for reading or appending, the Byte Order Mark (BOM) is used to determine the correct encoding. It is not necessary to specify the encoding with a flag. In fact, the flag will be ignored if it conflicts with the type of the file as indicated by the BOM. The flag is only used when no BOM is present or if the file is a new file. The following table summarizes the modes used in for various flags given to fopen and Byte Order Marks used in the file.

Encodings Used Based on Flag and BOM
Flag     | No BOM (or new file) | BOM: UTF-8 | BOM: UTF-16
---------+----------------------+------------+------------
UNICODE  | ANSI                 | UTF-8      | UTF-16LE
UTF-8    | UTF-8                | UTF-8      | UTF-16LE
UTF-16LE | UTF-16LE             | UTF-8      | UTF-16LE

#7


In Visual C++ 2005, fopen supports Unicode file streams. A flag specifying the desired
encoding may be passed to fopen when opening a new file or overwriting an existing file,
like this:

fopen("newfile.txt", "rw, ccs=<encoding>");

Allowed values of the encoding include UNICODE, UTF-8, and UTF16-LE. If the file is
already in existence and is opened for reading or appending, the Byte Order Mark (BOM)
is used to determine the correct encoding. It is not necessary to specify the encoding
with a flag. In fact, the flag will be ignored if it conflicts with the type of the
file as indicated by the BOM. The flag is only used when no BOM is present or if the
file is a new file. The following table summarizes the modes used in for various flags
given to fopen and Byte Order Marks used in the file.

Encodings Used Based on Flag and BOM
Flag     | No BOM (or new file) | BOM: UTF-8 | BOM: UTF-16
---------+----------------------+------------+------------
UNICODE  | ANSI                 | UTF-8      | UTF-16LE
UTF-8    | UTF-8                | UTF-8      | UTF-16LE
UTF-16LE | UTF-16LE             | UTF-8      | UTF-16LE

#8


不行,无论怎么getline都是乱码,我用C++的 宽字符读行函数可以读取中文,但是C++里好像没有可以支持的函数

#9


老婆老婆老婆来了

#10


引用 8 楼 nabasasun 的回复:
不行,无论怎么getline都是乱码,我用C++的 宽字符读行函数可以读取中文,但是C++里好像没有可以支持的函数

试试wcin.getline()