簡體   English   中英

如何將C ++中的wchar wstring轉換為更好的支持?

[英]How to Convert wchar wstring in C++ to something better supported?

我是一名Java開發人員,我已經開始編譯Android NDK編譯具有wchar和wstring等的C ++類的問題。在檢查是否有任何內容可能支持這些之后,我的發現到目前為止表明在NDK上沒有完全支持這些。 這意味着我需要在源代碼中更改它們。 怎么可以做到這一點? 謝謝

最好的方法是盡可能在Java中重寫:)

但是wchar和朋友基本上只是“具有16位而不是8位字符的零終止數組”。 微軟庫通過使用並行版本的strcpy()/ wstrcpy(),strlen()/ wstrlen()等來解決問題。確定使用wchar的位置應該相當簡單,並實現您可能需要的幾個簡單函數,不應該嗎?

好的,除了標記副本外,我發現了這篇有趣的文章:

TL; DR 我們選擇從Android開源項目中的JNI的Android實現中提取核心寬/窄轉換例程,因此轉換完全以本機代碼運行

寬而窄的字符串轉換

由於存在多種方法和標准,在移植應用程序時這是一個非常復雜的問題。 Windows Mobile(Windows CE)標准化為每個字符單元UTF-16的兩個字節,並且極少例外,ANSI或每個字符單元本機API的一個字節被消除。 C#語言和.NET Compact Framework也使用UTF-16。

Linux和Android本機API依賴於每個字符單元的單字節,空終止字符串。 Linux上的寬C ++字符是每個字符4個字節,而Microsoft平台上每個字符單元2個字節。 一種效果是使所有寬字符串的長度加倍,包括前面帶有L字符的字符串文字。

一種可能性是將包括代理對的UTF-16轉換為UTF-8多字節字符串,每個字符可能需要一到四個字節,並且可以包含嵌入的零字節。 Java Native Interface(JNI)提供了將Java UTF-16轉換為“Modified”UTF-8的例程。 修改導致一個窄字符串,不包含嵌入的零,只有字符串末尾的零。 另一個修改是將四字節UTF-16代理對轉換為兩個UTF-8字符,每個字節長三個字節而不是一個UTF-8字符,長度為四個字節。

使用JNI例程在寬字符串和窄字符串之間進行轉換的最終結果是寬UTF-16字符串格式與Java和Windows Mobile(CE)兼容,並且窄的Modified UTF-8字符串與Android / Linux OS API兼容和C運行時庫。

他的Android C運行時庫(Bionic)包含一個wchar.h來實現wcslen,wcscpy等功能,但是如標題中的注釋所述,在Android C運行時庫中沒有實現實際的寬字符函數。 我們通過使用GNU C ++編譯器選項“-fshort-wchar”來解決這個問題,該選項強制編譯器將寬字符視為兩個字節而不是四個字節。 這使得L“string”文字每個字符兩個字節並與UTF-16兼容。 我們從Wine開源項目中提取了實際的寬字符運行時庫。

可以使用Android中提供的JNI在本機C ++范圍和窄字符串之間進行轉換。 這涉及到Java環境的往返,因此效率不高。 我們選擇從Android開源項目中的JNI的Android實現中提取核心寬/窄轉換例程,以便轉換完全在本機代碼中運行

暫無
暫無

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

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