目前共有4篇帖子。 內容轉換:不轉換▼
 
點擊 回復
606 3
【C++函数整理】C++将宽字符串(wchar_t *和wstring)以UTF8编码格式写入txt文本文件的函数fputs_UTF8(不带头部BOM信息)
一派護法 十九級
1樓 發表于:2015-12-29 22:44

【函数的三个重载形式】
void fputs_UTF8(const wchar_t *str, FILE *fp);
用于将wchar_t字符数组写入通过fopen打开的文件中。

void fputs_UTF8(const wchar_t *str, ofstream &file);
用于将wchar_t字符数组写入通过ofstream打开的文件中。

void fputs_UTF8(wstring &wstr, ofstream &file);
用于将wstring字符串对象写入通过ofstream打开的文件中。

【使用范例】
// writestr.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <fstream>
#include <iostream>
#include <Windows.h>

using namespace std;

void fputs_UTF8(const wchar_t *str, FILE *fp)
{
    int size = WideCharToMultiByte(CP_UTF8, NULL, str, -1, NULL, 0, NULL, NULL);
    char *buffer = (char *)malloc(size * sizeof(char));
    WideCharToMultiByte(CP_UTF8, NULL, str, -1, buffer, size, NULL, NULL);
    fwrite(buffer, size - sizeof(char), 1, fp);
    free(buffer);
}

void fputs_UTF8(const wchar_t *str, ofstream &file)
{
    int size = WideCharToMultiByte(CP_UTF8, NULL, str, -1, NULL, 0, NULL, NULL);
    char *buffer = new char[size];
    WideCharToMultiByte(CP_UTF8, NULL, str, -1, buffer, size, NULL, NULL);
    file.write(buffer, size - 1);
    delete buffer;
}

void fputs_UTF8(wstring &wstr, ofstream &file)
{
    int size = WideCharToMultiByte(CP_UTF8, NULL, wstr.c_str(), -1, NULL, 0, NULL, NULL);
    char *buffer = new char[size];
    WideCharToMultiByte(CP_UTF8, NULL, wstr.c_str(), -1, buffer, size, NULL, NULL);
    file.write(buffer, size - 1);
    delete buffer;
}

int _tmain(int argc, _TCHAR* argv[])
{
    wchar_t wch[] = L"简体中文ABC";
    FILE *fp;
    fopen_s(&fp, "test/utf8test.txt", "w");
    fputs_UTF8(wch, fp);
    fclose(fp);

    fopen_s(&fp, "test/utf8emptytest.txt", "w");
    fputs_UTF8(L"", fp);
    fclose(fp);

    ofstream file("test/ofstreamutf8test.txt", ios::out);
    fputs_UTF8(wch, file);
    file << endl << "English letters can be directly output.";
    file.close();

    wstring wstr = L"这是一个C++里面的wstring字符串。";
    file.open("test/ofstreamutf8test2.txt", ios::out);
    fputs_UTF8(wstr, file);
    file << endl << "English letters can be directly output.";
    file.close();
    return 0;
}

【生成的文件】

其中一个文件:


一派護法 十九級
2樓 發表于:2015-12-29 22:47

用Notepad++打开写入的txt文件,从右下角可以看到确实是UTF-8格式。
并且,utf8test.txt这个文件里的内容是:

大小是15字节。说明中文占了3个字节,英文字母占了1个字节。
一派護法 十九級
3樓 發表于:2015-12-30 22:58

【读取UTF8文本文件的方法】
// readstr.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <fstream>
#include <iostream>
#include <Windows.h>

using namespace std;

wstring toWideStr(char *str)
{
    int size = MultiByteToWideChar(CP_UTF8, NULL, str, -1, NULL, NULL);
    wchar_t *buffer = new wchar_t[size];
    MultiByteToWideChar(CP_UTF8, NULL, str, -1, buffer, size);
    wstring wstr(buffer);
    delete buffer;
    return wstr;
}

int _tmain(int argc, _TCHAR* argv[])
{
    ifstream file("Monsters.as", ios::in);
    char str[100];
    file.getline(str, 100);
    cout << str << endl;

    setlocale(LC_CTYPE, "chs");
    wstring wstr = toWideStr(str);
    wcout << wstr.c_str() << endl;

    file.close();
    system("pause");
    return 0;
}

输出:
// 杩欎簺浠g爜鏄€墿缂栬緫鍣ㄧ敓鎴愮殑锛岃涓嶈鎵嬪姩淇敼杩欎簺浠g爜
// 这些代码是怪物编辑器生成的,请不要手动修改这些代码
Press any key to continue . . .
一派護法 十九級
4樓 發表于:2016-1-27 13:18

差点忘了,上面的delete都应该改成delete[],因为创建时用的是new []。

回復帖子

內容:
用戶名: 您目前是匿名發表
驗證碼:
(快捷鍵:Ctrl+Enter)
 

本帖信息

點擊數:606 回複數:3
評論數: ?
作者: 巨大八爪鱼
最後回復:巨大八爪鱼
最後回復時間:2016-1-27 13:18
 
©2010-2024 Arslanbar Ver2.0
除非另有聲明,本站採用創用CC姓名標示-相同方式分享 3.0 Unported許可協議進行許可。