亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

WChars、編碼、標準和便攜性

WChars、編碼、標準和便攜性

C++
白衣非少年 2019-07-02 17:23:57
WChars、編碼、標準和便攜性下面的問題可能不符合要求,如果超出范圍,請隨時告訴我離開。這里的問題基本上是,“我是否正確地理解了C標準,這是正確的方法嗎?”我想要求澄清、確認和更正我對C中字符處理的理解(因此C+和C+0x)。首先,一個重要的觀察:可移植性和序列化是正交概念。便攜的東西就像C,unsigned int, wchar_t..可序列化的東西是這樣的uint32_t或者UTF-8。“可移植”意味著您可以在每個受支持的平臺上重新編譯相同的源代碼并獲得工作結果,但是二進制表示可能完全不同(甚至不存在,例如tcp對載體鴿子)。另一方面,可序列化的事物總是具有同表示,例如,我可以在Windows桌面、手機或牙刷上讀取的PNG文件。可移植的東西是內部的,可串行化的東西處理I/O,便攜的東西是類型化的,可序列化的東西需要類型雙關語。</序言>談到C中的字符處理,有兩組內容分別與可移植性和序列化相關:wchar_t, setlocale(), mbsrtowcs()/wcsrtombs(): C標準對“編碼”只字不提。事實上,它對任何文本或編碼屬性都是完全不可知的。上面只寫著“你的切入點是main(int, char**);你得到了一個類型wchar_t它可以保存系統的所有字符;您可以獲得讀取輸入字符序列的函數,并將它們轉換為可行的wstring,反之亦然。iconv()和UTF-8,16,32:在定義明確的固定編碼之間轉換代碼的函數/庫。ICov處理的所有編碼都是普遍理解和商定的,只有一個例外。C的可移植的、編碼不可知的世界與它之間的橋梁wchar_t可移植字符類型和確定性外部世界是WCHAR-T和UTF之間的ICUV轉換.因此,我應該始終將字符串存儲在與編碼無關的wstring中嗎?wcsrtombs(),并使用iconv()為了序列化?概念上:                        my program    <-- wcstombs ---  /==============\   --- iconv(UTF8, WCHAR_T) -->CRT                   |   wchar_t[]  |                                <Disk>    --- mbstowcs -->  \==============/   <-- iconv(WCHAR_T, UTF8) ---                            |                            +-- iconv(WCHAR_T, UCS-4) --+                                                        |       ... <--- (adv. Unicode malarkey) ----- libicu ---+實際上,這意味著我會為我的程序入口點編寫兩個鍋爐板包裝器,例如C+:// Portable wmain()-wrapper#include <clocale>#include <cwchar>#include <string>#include <vector>這是使用純標準C/C+編寫一個慣用的、可移植的、通用的、與編碼無關的程序核心的正確方法嗎?(請注意,Unicode規范化或diacritic替換等問題超出了范圍;只有在您決定實際需要之后才能解決。Unicode(與你可能想要的任何其他編碼系統不同),現在是處理這些細節的時候了嗎,例如使用像libicu這樣的專用庫。)
查看完整描述

3 回答

?
森林海

TA貢獻2011條經驗 獲得超2個贊

我會避開wchar_t輸入是因為它依賴于平臺(根據您的定義不是“可序列化的”):在Windows上輸入utf-16,在大多數類Unix系統上輸入UTF-32。相反,使用char16_t和/或char32_t類型來自C+0x/c1x。(如果您沒有新的編譯器,請將它們設為uint16_tuint32_t)

定義在UTF-8、UTF-16和UTF-32函數之間轉換的函數.

寫入重載窄/寬版本的每一,每個字符串函數,就像WindowsAPI對-A和-W所做的那樣。采摘首選內部使用的編碼,并堅持使用。對于需要不同編碼的事物,根據需要進行轉換。


查看完整回答
反對 回復 2019-07-02
?
拉風的咖菲貓

TA貢獻1995條經驗 獲得超2個贊

與.有關的問題wchar_t編碼無關的文本處理太困難了,應該避免。如果像您所說的那樣堅持使用“純C”,則可以使用所有w*像這樣的功能wcscat朋友們,但是如果你想做更復雜的事情,你就得跳進深淵。

以下是一些困難得多的事情wchar_t如果你只選擇一個UTF編碼的話:

  • 解析Javascript:標識符可以包含BMP之外的某些字符(假設您關心這種正確性)。

  • HTML:你怎么轉&#65536;變成一串wchar_t?

  • 文本編輯器:如何在wchar_t弦樂?

如果我知道字符串的編碼,我可以直接檢查字符。如果我不知道編碼,我必須希望,無論我想對字符串做什么,都是由某個庫函數實現的。所以wchar_t有點不相干,因為我不認為這是有用數據類型。

您的程序要求可能不同,而且wchar_t可能對你沒問題。


查看完整回答
反對 回復 2019-07-02
  • 3 回答
  • 0 關注
  • 386 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號