簡體   English   中英

如何在C++中用fprintf寫入UTF-8文件

[英]How to write UTF-8 file with fprintf in C++

我正在使用 VisualStudio 和 MFC 在 C++ 中(偶爾)進行編程。我用 fopen 和 fprintf 編寫了一個文件。 該文件應以 UTF8 編碼。 有沒有可能這樣做? 無論我嘗試什么,該文件都是雙字節 unicode 或 ISO-8859-2 (latin2) 編碼。

格蘭布里奇

是的,但您需要 Visual Studio 2005 或更高版本。 然后,您可以使用參數調用 fopen:

LPCTSTR strText = "абв";
FILE *f = fopen(pszFilePath, "w,ccs=UTF-8");
_ftprintf(f, _T("%s"),  (LPCTSTR) strText);

請記住這是 Microsoft 擴展,它可能不適用於 gcc 或其他編譯器。

如果您只想使用 fprintf,則不需要設置語言環境或在文件上設置任何特殊模式。 您只需使用 UTF-8 編碼字符串即可。

#include <cstdio>
#include <codecvt>

int main() {
    std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>,wchar_t> convert;
    std::string utf8_string = convert.to_bytes(L"кошка 日本國");

    if(FILE *f = fopen("tmp","w"))
        fprintf(f,"%s\n",utf8_string.c_str());
}

將程序保存為帶有簽名或 UTF-16 的 UTF-8(即不要使用沒有簽名的 UTF-8,否則 VS 將無法生成正確的字符串文字)。 程序寫入的文件將包含該字符串的 UTF-8 版本。 或者你可以這樣做:

int main() {
    if(FILE *f = fopen("tmp","w"))
        fprintf(f,"%s\n","кошка 日本國");
}

在這種情況下,您必須將文件另存為不帶簽名的 UTF-8,因為您希望編譯器認為源代碼編碼與執行編碼相同......這有點依賴於編譯器 IMO 破壞行為.

您可以使用任何其他 API 執行基本相同的操作以將窄字符寫入文件,但請注意,這些方法都不適用於將 UTF-8 寫入 Windows 控制台。 由於 C 運行時和/或控制台有點損壞,您只能通過執行 SetConsoleOutputCP(65001) 將 UTF-8 直接寫入控制台,然后使用puts的一種輸入變體。

如果您想使用寬字符而不是窄字符,那么可以使用基於區域設置的方法和文件描述符的設置模式。

#include <cstdio>
#include <fcntl.h>
#include <io.h>

int main() {
    if(FILE *f = fopen("tmp","w")) {
        _setmode(_fileno(f), _O_U8TEXT);
        fwprintf(f,L"%s\n",L"кошка 日本國");
    }
}

#include <fstream>
#include <codecvt>

int main() {
    if(auto f = std::wofstream("tmp")) {
        f.imbue(std::locale(std::locale(),
                new std::codecvt_utf8_utf16<wchar_t>)); // assumes wchar_t is UTF-16
        f << L"кошка 日本國\n";
    }
}

理論上,您應該簡單地設置一個使用 UTF-8 作為外部編碼的語言環境。 我的理解——我不是 Windows 程序員——是Windows 沒有這樣的 locale ,所以你必須求助於實現特定的方法或非標准庫(鏈接來自 Dave 的評論)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM