Windows使用UTF-16,建立UTF-16檔案請設定前兩個位元組為0xfffe,這是UTF-16的BOM碼

來源:互聯網
上載者:User
windows下的Unicode是UTF-16,每個字都用兩個位元組來表示。編程的時候,通過TEXT宏,以及在項目中定義Unicode, _Unicode變數,就可以保證整個項目都是在Unicode下工作。

現在在將字串寫入檔案的時候,發生了一些問題。寫檔案用的是WriteFile函數,字串本身都是UTF-16的,寫入檔案後發現用vim和記事本開啟都無法正確顯示。用16進位的方式查看,每個字都是對的,都是2個位元組,如果是英文字母,第二個位元組就是00。

google 了一下,發現了答案。要在檔案開頭寫入0xfffe,這是Unicode file的identifier,windows下的記事本和寫字板讀到這個頭之後,就能正確識別這是一個Unicode檔案了。所以,在代碼中,建立文 本檔案的時候,要多寫這樣一段(用ScheduleDownload的logger.cpp來做個例子):

                    // logfile doesn't exist, create it, that's all
          hFile = CreateFile(log_file_path, GENERIC_WRITE, NULL, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL);
          if (hFile == INVALID_HANDLE_VALUE) {
             operate_result = FALSE;
          } else {
             // write 0xfffe at the beginning of the file, this makes Notepad reads Unicodes well
             WORD unicode_identifier = 0xfeff;
             if (WriteFile(hFile, &unicode_identifier, sizeof(WORD), &bytes_written, NULL)) {
                operate_result = TRUE;
             } else {
                operate_result = FALSE;
             }
          }
          goto finished;

    finished:
       if (hFile != NULL && hFile != INVALID_HANDLE_VALUE)
          CloseHandle(hFile);
       return operate_result;

 

這裡不要奇怪為什麼設定給unicode_identifier變數的值是0xfeff,這是因為x86是little endian,所以代碼中的oxfeff存在寄存器中,然後設定到記憶體的時候,從低地址到高地址就變成了fffe,這樣最後將這個WORD寫入檔案之後就 正好是fffe了。

最後我自己又測試了一下,寫入中文也是沒有問題的。使用gvim來開啟的話需要設定一下,我在Ubuntu下開啟檔案是OK的,windows下的gvim的.vimrc設定和Ubuntu一樣的話,應該也是沒問題的。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.