簡體   English   中英

這個 UTF-8 中的 BOM 不正確嗎?

[英]Is this BOM in UTF-8 incorrect?

我想驗證 UTF-8 中的 BOM,並編寫了下面的 c++ 代碼。

但是,結果是0XFFFFFFEF, 0XFFFFFFBB, 0XFFFFFFBF

這與我預期的0XEF, 0XBB, 0XBF 不同

為什么結果變成了上面?

順便說一下,使用的 UTF-8 文件是由 Notepad++ 制作的。

#include <iostream>
#include <fstream>

using namespace std;

int main()
{
        char file[]="/*UTF-8 file*/"; 
        
        char a[3]{};

        ifstream ifs(file, ios_base::binary);
        
        ifs.read(a, static_cast<streamsize>(sizeof(a)));
        
        cout << showbase << uppercase;
        
        for(int i:a){
                cout << hex << i << endl;
        }
}

環境

海灣合作委員會 9.2.0

編譯選項:-std=c++2a

BOM 本身沒問題。 您只是錯誤地打印出字節。

您看到的結果是由於將有符號的8 位char符號擴展為有符號的 32 位整數。 char是有符號還是無符號是編譯器定義的,除非您在代碼中明確說明。 在您的情況下,您正在使用(隱式)簽名char 有符號char值 > 127 將其高位設置為 1,這將在將有符號 8 位值擴展為有符號 32 位值時用 1 填充新位。

要正確輸出字節,您需要對值進行零擴展,而不是符號擴展。 為此使用unsigned類型,例如:

#include <iostream>
#include <fstream>

using namespace std;

int main()
{
    char file[] = "/*UTF-8 file*/";
    unsigned char a[3];

    ifstream ifs(file, ios_base::binary);
    ifs.read(reinterpret_cast<char*>(a), sizeof(a));

    cout << showbase << uppercase;

    for(unsigned int i : a){
        cout << hex << setw(2) << setfill(‘0’) << i << endl;
    }
}

暫無
暫無

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

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