簡體   English   中英

無法在 GLFW window 標題中顯示“ä”

[英]Can't display 'ä' in GLFW window title

glfwSetWindowTitle(win, "Nämen");

變成“N?men”,其中“?” 有點黑,扭曲的方塊,表示無法顯示該字符。

我如何顯示'ä'?

如果要在 window 標題中使用非 ASCII 字母,則字符串必須是 utf-8 編碼。

GLFW:Window 標題

window 標題是使用 UTF-8 編碼的常規 C 字符串。 這意味着,例如,只要您的源文件編碼為 UTF-8,您就可以使用任何 Unicode 字符。

如果你看到一個黑色的扭曲方塊,那么這表明ä是用一些不是 UTF-8 的 iso 編碼編碼的,可能類似於 latin1。 要解決此問題,您需要在編輯器中打開它,您可以在其中更改文件的編碼,將其更改為 uft-8(無 BOM)並修復標題中的ä

在這種情況下,根據規范,GLFW 實現似乎不起作用。 可能 function 仍然使用 Latin-1 而不是 UTF-8。

我在 GLFW 3.3 Windows 64 位預編譯二進制文件上遇到了同樣的問題,並像這樣修復它:

SetWindowTextA(glfwGetWin32Window(win),"Nämen")

問題不在 GLFW 中,而在編譯器中。 編碼由主要編譯器處理如下:

  • 好人clang假設每個文件都編碼為UTF-8
  • Trusty gcc檢查系統的設置1並在無法確定 1 時回退到 UTF-8。
  • MSVC檢查 BOM 並使用檢測到的編碼; 否則它假定文件是使用用戶當前代碼頁2編碼的。

您只需在 (Windows) 控制台或 PowerShell 中運行chcp即可確定當前代碼頁。對我來說,在全新安裝 Windows 11 時,它會生成“850”(語言:英語;鍵盤:德語),代表代碼第 850 頁

要解決此問題,您有多種解決方案:

  • 更改您的系統代碼頁。 可以說是最糟糕的解決方案。
  • 在字符串前加上u8前綴,轉義所有 unicode 文字,並在傳遞 Win32 函數之前將字符串轉換為寬字符; 例如:
    const char* title = u8"\u0421\u043b\u0430\u0432\u0430\u0020\u0423\u043a\u0440\u0430\u0457\u043d\u0456\u0021";
    
    // This conversion is actually performed by GLFW; see footnote ^3
    const int l = MultiByteToWideChar(CP_UTF8, 0, title, -1, NULL, 0);
    wchar_t* buf = _malloca(l * sizeof(wchar_t));
    MultiByteToWideChar(CP_UTF8, 0, title, -1, buf, l); 

    SetWindowTextW(hWnd, buf);
    _freea(buf);
  • 使用 UTF-8 編碼WITH BOM保存您的源文件。 這使您無需轉義即可編寫字符串。 您仍然需要使用上面看到的方法將字符串轉換為寬字符字符串。
  • 編譯時指定/utf-8標志; 這與之前的解決方案具有相同的效果,但您不再需要 BOM。

上述解決方案仍然需要您將好的字符串轉換為粗大的寬字符串。

另一種選擇是提供activeCodePage設置為UTF-8的清單4 這樣,所有帶有A后綴的 Win32 函數(例如SetWindowTextA )現在都可以接受並正確處理 UTF-8 字符串,如果正在運行的系統至少或更新於 Windows 版本 1903。


長話短說

/utf-8標志處於活動狀態的情況下編譯您的應用程序。

重要提示:這適用於 Win32 API。 這不會讓你像時髦的 JS 開發人員一樣神奇地將 Unicode 表情符號寫入控制台。


1我想它讀取 linux 上的 LC_ALL 設置。在過去的 6 年里,我從未見過沒有指定 UTF-8 的發行版。但是,請對這些信息持保留態度; 關於 gcc 現在如何處理這個問題,我可能完全錯了

2 如果沒有找到字節順序標記,則假定源文件是在當前用戶代碼頁中編碼的[...]。

3 GLFW 執行此處所示的轉換。

4有關 Win32 ANSI-API、清單和 UTF-8 的更多信息,請參見此處

暫無
暫無

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

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