[英]compelling wchar_t to be 4 bytes
實際問題-我正在研究一個可以在2個單獨的硬件平台上運行的小應用程序。
編譯方法及其配置由我定義和控制。
我的應用程序收到UTF-8 / ISO-8859文本,並且應該對字符串執行一些基本操作(復制,搜索等)。
問題是,一個編譯器是GCC(sizeof(wchar_t)== 4),而另一個是Mingw(sizeof(wchar_t)== 2)。
為了支持所有UTF-8可能性,我認為代碼中wchar_t中的“ typedef”類型為uint32_t,因此將迫使Mingw編譯器在同一行上,並覆蓋所有UTF-8選項。
然后,我打算使用標准庫(mbstowcs,wcscmp,wcscpy等)提供的寬字符操作功能。
問題是,是否會“迫使”編譯器使用更多空間,可能會對庫功能產生一些不良影響(除了性能)(更改后mbtowcs甚至可以在這里工作嗎?)
我嘗試使用ICU,但這是一個非常大的庫,因此無法達成協議。 我需要它小巧可靠。
謝謝
這是用於字符串操作的選項:
使用unsigned char
(或char
)和UTF-8。 所有常規的字符串操作函數均起作用(例如strlen()
, strstr()
, snprintf()
等)。
在不同的平台上使用wchar_t
並使用不同的編碼(Win32使用UTF-16,OS X和Linux使用UTF-32)。 這是一條瘋狂的路,因為您必須在同一代碼庫中支持兩種不同的編碼。
使用UTF-32或UTF-16和您自己的字符串操作函數。 這是很多工作,但是是可移植的。
使用ICU和UTF-16。
在大多數情況下,以UTF-8操作字符串非常有效。 這取決於您的程序做什么。 如果您正在執行諸如解析和模板化之類的工作,那么UTF-8便很容易使用。 如果您需要更復雜的功能(例如遍歷斷點或查找字素簇邊界),則需要一個庫,例如Glib(使用UTF-8)或ICU(使用UTF-16)。
您可能習慣於使用字符/代碼點索引來為字符串編制索引。 習慣於使用代碼單元索引為字符串建立索引:所以strlen()
返回字節數,而不是字符數。 但是,實際上很少需要按字符位置索引字符串。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.