`
bjwyl66
  • 浏览: 16197 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

C++读取和处理UTF-8格式文件的方法

    博客分类:
  • c++
c++ 
阅读更多
关于UTF-8、GB2313、ANSI、UNICODE的编码问题,在此不多说,百度上资料很多的。
以下为源代码:
// UtfFile.h: interface for the UtfFile class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_UTFFILE_H__8ED10D8A_D1A3_412F_A600_124F521CE4F1__INCLUDED_)
#define AFX_UTFFILE_H__8ED10D8A_D1A3_412F_A600_124F521CE4F1__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#include <windows.h> 
#include <stdio.h>
#include <locale.h>
#include <IOSTREAM>
#include <FSTREAM>
using namespace std;

class UtfFile 
{
public:
 static char * UnicodeToGB2312(WCHAR uData, char buffer[2]);  // Unicode 转换成 GB2312
 static WCHAR * UTF_8ToUnicode(char *pText, WCHAR &unicode);  // 把UTF-8 转化成 Unicode
 static char * TranslateUTF8ToGB(char *str, size_t len);   // 把UTF-8字符串转化成ANSI(GB2312)编码形式
 char * GetString(char *str, int maxLen = 1024);  // 读取一个字符串,以换行符为结束标示
 char * GetLine(char *str, int maxLen);    // 读取一行字符
 void close();          // 关闭文件流
 int open(const char *sFileName);     // 用于打开一个文件
 UtfFile(const char *sour);
 virtual ~UtfFile();
 
private:
 ifstream inf;
};

#endif // !defined(AFX_UTFFILE_H__8ED10D8A_D1A3_412F_A600_124F521CE4F1__INCLUDED_)

 

/*-----------------------------------------------以下为.cpp文件内容------------------------------------------*/

// UtfFile.cpp: implementation of the UtfFile class.
//
//////////////////////////////////////////////////////////////////////

#include "UtfFile.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

UtfFile::UtfFile(const char *sour)
:inf(sour)
{
 if( !inf.is_open() )
 {
  char str[1024];
  sprintf(str, "错误的文件路径,文件无法打开:%s", sour);
  throw runtime_error(str);
 }
}

UtfFile::~UtfFile()
{

}

void UtfFile::close()
{
 inf.close();
}


char * UtfFile::GetLine(char *str, int maxLen)
{
 if ( inf.eof() )
 {
  str[0] = '\0';
 }
 else
 {
  inf.getline(str, maxLen);
  TranslateUTF8ToGB(str, maxLen);
 }
 return str;
}


char * UtfFile::GetString(char *str, int maxLen)
{
 if ( inf.eof() )
 {
  str[0] = '\0';
 }
 else
 {
  inf >> str;
  TranslateUTF8ToGB(str, maxLen);
 }
 return str;
}

 

char * UtfFile::UnicodeToGB2312(WCHAR uData, char buffer[2])
{
 WideCharToMultiByte(CP_ACP,NULL, &uData, 1,buffer,sizeof(WCHAR),NULL,NULL);
 return buffer;
}

WCHAR * UtfFile::UTF_8ToUnicode(char *pText, WCHAR &unicode)
{ 
/*    http://blog.csdn.net/liuzhiyuan1982/article/details/3911150
UTF-8是一种多字节编码的字符集,表示一个Unicode字符时,它可以是1个至多个字节,在表示上有规律:
1字节:0xxxxxxx
2字节:110xxxxx 10xxxxxx
3字节:1110xxxx 10xxxxxx 10xxxxxx
4字节:11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
*/
 char *uchar = (char *)&unicode; 
 uchar[1] = ((pText[0] & 0x0F) << 4) + ((pText[1] >> 2) & 0x0F);
 uchar[0] = ((pText[1] & 0x03) << 6) + (pText[2] & 0x3F);
 return &unicode;
}

char * UtfFile::TranslateUTF8ToGB(char *str, size_t len)
{
 char * newCharBuffer = new char[len];
 int index =0;
 int nCBIndex = 0;
 WCHAR wTemp = 0;
 char cTemp[2] = " ";
 while(index < len)
 {
  if ( str[index] == 0 )
   break;
  else if(str[index] > 0)  // 如果是GB2312的字符
  {
   newCharBuffer[nCBIndex] = str[index];    //直接复制
   index += 1;    //源字符串偏移量1
   nCBIndex += 1;   //目标字符串偏移量1
  }
  else      //如果是UTF-8的字符
  {
   UTF_8ToUnicode(str + index, wTemp);   //先把UTF-8转成Unicode
   UnicodeToGB2312(wTemp, &newCharBuffer[nCBIndex]); //再把Unicode 转成 GB2312
   index += 3;    //源字符串偏移量3
   nCBIndex += 2;   //目标字符串偏移量2  因为一个中文UTF-8占3个字节,GB2312占两个字节
  }
 }
 newCharBuffer[nCBIndex] = '\0'; //结束符
 strcpy( str, newCharBuffer );
 delete newCharBuffer;  //避免内存泄漏,这是对源代码的稍许修改
 newCharBuffer = NULL;
 return str;  
}

int UtfFile::open(const char *sFileName)
{
 inf.open(sFileName);
 return inf.is_open();
}



分享到:
评论

相关推荐

    utf-8.rar_c++ string utf-8_string to utf-8_utf_utf 8_utf-8

    `std::string`通常用来存储和处理以字节序列形式表示的文本,而UTF-8恰好就是这样一种以字节为基础的编码方式。 在UTF-8编码中,每个Unicode字符可能由1到4个连续的字节表示。因此,当你处理`std::string`时,需要...

    C++ 实现unicode到utf-8的转码

    通过分析和理解这个示例,你可以更好地掌握Unicode到UTF-8的转换方法。学习这样的转换技巧对于开发跨平台、支持多种语言的应用程序至关重要,特别是在网络通信、文件存储和用户界面显示等领域。 总之,理解和实现...

    判断文本文件是否为UTF-8编码

    但没有BOM的UTF-8文件也是存在的,所以这一步不能作为唯一依据。 2. **扫描字节序列**:遍历文件内容,检查字节序列是否符合UTF-8编码规则。对于多字节字符,后续字节的最高位应为10,且每个字节的排列组合能对应到...

    MFC UTF-8文件批量转成GB2312 解决中文乱码问题

    在本场景中,我们面对的问题是“MFC UTF-8文件批量转成GB2312 解决中文乱码问题”,这涉及到文件的读取、编码转换以及文件的写入操作。 首先,我们需要理解UTF-8和GB2312这两种编码的区别。UTF-8是一种变长的...

    GBK 与 UTF-8 间编码转换

    GBK 和 UTF-8 是两种常见的字符编码格式,它们各自有其特点和应用场景。本篇文章将详细阐述这两种编码的区别、转换原理以及如何进行转换。 GBK(Great Chinese)编码是中国大陆广泛使用的多字节字符集,它是GB2312...

    UTF-8.rar_utf_utf gb2312_utf 转换_utf-8_utf-8解码

    例如,读取一个UTF-8编码的文本文件,可以使用以下Python代码: ```python with open('file.txt', 'rb') as file: content_bytes = file.read() content_str = content_bytes.decode('utf-8') ``` 这段代码中,`...

    .h .cpp 转成utf-8格式,QT写的,做linux下的应用开发很有用

    标题提到的".h .cpp 转成utf-8格式",意味着这个工具专门针对C++源代码文件(头文件.h和实现文件.cpp)进行编码转换。在Linux环境下,源代码通常期望是UTF-8编码,因为这样可以确保在各种系统和库之间兼容性更好,...

    StdioFile unicode-utf-8操作

    2. 读取UTF-8字符: 由于UTF-8字符可能跨越多个字节,我们不能直接使用`fgetc()`或`fgets()`来读取单个字符。相反,我们需要编写自定义的循环来处理多字节序列。可以使用`fread()`来读取字节,然后解析成UTF-8字符...

    MFC读取utf8示例

    理解并掌握如何在MFC环境中读取UTF-8文件是一项基础但重要的技能,它能够帮助开发者处理各种国际化和本地化的需求,尤其在处理包含中文或其他非英文字符的文本时。通过以上代码和步骤,你可以更好地理解和实现这一...

    UTF-8编码格式转换

    2. **读取UTF-8**:在C/C++中,可以使用标准库如`fread`或`scanf`来读取文件内容,但由于它们默认处理的是字节流,因此需要额外的逻辑来识别UTF-8编码的字符边界。 3. **写入UTF-8**:类似地,`fwrite`和`fprintf`...

    Carmela提供基于PHP,PHP扩展,JAVA,C++等语言的一套处理4四节UTF-8解决方案

    标题中的"Carmela提供基于PHP,PHP扩展,JAVA,C++等语言的一套处理4四节UTF-8解决方案"表明这是一个软件项目,旨在解决多语言环境下,特别是涉及到UTF-8编码格式的问题。UTF-8是一种广泛使用的Unicode字符编码,它...

    C++写的Windows下GB2312与UTF-8相互转换代码.rar

    在Windows环境下,C++开发过程中,常常需要处理各种编码格式之间的转换,比如GB2312(简体中文的一种常见编码)与UTF-8(通用的多语言编码)。本项目提供的"ChineseCode.cpp"和"ChineseCode.h"文件,正是为了解决这...

    VC ANSI环境下按行读取ANSI、UNICODE 、UNICODE big endian、UTF-8四种文本文件

    本资源摘要信息介绍了如何在VC ANSI环境下按行读取四种不同编码格式的文本文件,包括ANSI、UNICODE、UNICODE big endian和UTF-8。通过研究这四种编码方式的特点,设计了一个继承自CStdioFile类的扩展类CStdioFileEx...

    c/c++ 字符集 gbk/utf8互转,Ansi/Utf8互转 纯c实现跨平台

    本文将深入探讨C/C++中GBK/UTF-8以及ANSI/UTF-8字符集的转换,以及如何通过纯C代码实现这些转换,确保程序在Windows和Linux等不同操作系统上的一致性。 首先,我们需要理解字符集的基础知识。ASCII是最基础的字符集...

    UTF-8转换为GB312

    可以使用不同含有特殊字符的UTF-8文件作为测试样例,检查转换结果。 10. **代码优化**:为了提高性能,可以考虑使用多线程或异步操作,特别是在处理大量数据时。 综上所述,实现“UTF-8转换为GB2312”涉及了字符...

    【最新】C++ md5对字符串/对文件, AES CBC UTF-8加密

    3. 实现AES-CBC加密:创建一个函数,接受文件路径、密钥和初始化向量作为参数,读取文件内容,进行UTF-8到字节的转换,然后进行AES-CBC加密,生成加密后的字节流。 4. 创建网络通信代码:`socket_client`应该包含...

    UTF-8GB2312互转

    总之,理解和掌握UTF-8与GB2312的转换方法,以及如何在编程中处理中文乱码问题,对于开发涉及中文字符的应用至关重要。正确处理编码问题,不仅能提高用户体验,也有助于软件的稳定性和跨平台兼容性。

    字符编码笔记:ASCII-Unicode和UTF-8

    字符编码笔记:ASCII、Unicode 和 UTF-8 本文主要介绍了字符编码的基本概念和历史发展过程,包括 ASCII 码、Unicode 和 UTF-8 的编码原理和特点。文章首先介绍了 ASCII 码的历史和编码原理,然后讨论了非 ASCII ...

    windows下利用libiconv将实现utf8和gbk编码之间转换

    此外,如果处理的文本包含非ASCII字符,还需要注意字节顺序标记(BOM)的影响,因为UTF-8和GBK都不包含BOM,但某些程序可能会添加BOM来标识文件编码。 总之,libiconv在Windows环境下的UTF-8和GBK编码转换是通过...

    C++读取TXT文件识别特定内容修改

    由于近期需要将一份Word文档转到Markdown格式,但是文件内容较大,自动转换...程序中实现了UTF-8格式转GBK格式,使用stream对TXT进行读取并识别,获取到需要的信息后对信息进行更改,最后依据一级标题对文件进行拆分。

Global site tag (gtag.js) - Google Analytics