[英]Can't display 'ä' in GLFW window title
glfwSetWindowTitle(win, "Nämen");
變成“N?men”,其中“?” 有點黑,扭曲的方塊,表示無法顯示該字符。
我如何顯示'ä'?
如果要在 window 標題中使用非 ASCII 字母,則字符串必須是 utf-8 編碼。
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 中,而在編譯器中。 編碼由主要編譯器處理如下:
您只需在 (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
標志; 這與之前的解決方案具有相同的效果,但您不再需要 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.