簡體   English   中英

如何在 C 中將 wchar_t 轉換為多字節 char

[英]How to convert wchar_t to multi-bytes char in C

我正在尋找一種將 wchar_t 轉換為多字節字符的方法,而不使用 wctomb 或任何現成的例程。 我必須在 C 而不是 C++ 中這樣做,並且互操作性在這里並不重要。

我的目標是使用 write 系統調用逐字節打印 wchar。 例如,'é' 字符等價於 0xe9 編碼為 wchar,並且等價於多字節形式的ff ff ff c3 ff ff ff a9 我可以從一種形式切換到另一種形式嗎?

提前致謝。

我正在尋找一種將 wchar_t 轉換為多字節字符的方法,而不使用 wctomb 或任何現成的例程

這與任意兩種編碼之間的轉換相同。 首先確定用於對源和目標中的字符進行編碼的編碼,然后將字符從一種編碼轉換為另一種編碼。

所以首先wchar_t - 它的編碼是(或應該是)常量,由您的編譯器和環境確定。 因此,請閱讀您的環境和編譯器。 You specified Debian, using gcc then read gcc documentation and nowadays on linux wchar_t is meant to represent one UCS-4 "character" . 請注意,在 windows wchar_t上是UTF-16

然后確定目標編碼,多字節字符串的編碼 - 它取決於locale 讀取和解析LC_CTYPE語言環境,您可能需要閱讀posix 語言環境和關於語言環境命名 然后,由於在語言環境未指定codeset的悲慘情況下without using any ready-made routine ,您必須為特定於locale的文件編寫自己的特定於平台的解析器並推斷特定當前語言環境的默認字符編碼(我是不太確定這里是怎么發生的,你必須找到“區域設置語言類別”)。 man 7 locale man 7 charsets這樣的頁面看起來不錯。

然后在確定目標和源編碼之后,您需要編寫一個例程,將一種編碼轉換為另一種編碼。 因為without using any ready-made routine你不想使用iconv ,這意味着你必須自己編寫它。 這將讀取兩種編碼的規范以及這些編碼中的哪些代碼點代表哪些字符,然后決定如何將每個代碼點從一種編碼轉換為另一種編碼。

總而言之,另一個項目的源代碼,如glibc 源代碼libiconvlibunistring可能是靈感的來源。

這是一個學校項目,所以一旦你知道了訣竅,我想並不難。

最有可能的多字節編碼是 UTF-8,unicode 是當今世界的主宰。 因此,您需要研究如何將 UTF-32 轉換為 UTF-8,這實際上是一個簡單的例程。

暫無
暫無

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

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