2011-11-21 88 views
0

字符集編碼會影響strstr()函數的結果嗎?編碼是否會影響strstr()(和相關函數)的結果

例如,我已讀出一個數據爲「BUF」和做到這一點:

char *p = strstr (buf, "UNB"); 

不知在ASCII或其他人(例如EBCDIC)的數據是否被編碼影響此函數的結果? (由於「UNB」是不同編碼方式下的不同位流...)

如果是,那麼這些函數使用的默認值是什麼? (ASCII?)

謝謝!

+2

如果輸入數據的字符編碼與您的「原生」編碼不匹配,那麼上述可能確實不起作用。 –

回答

3

的C函數對原始char數據操作匹配, 獨立地編碼的。在這種情況下,你可能有兩個 不同的編碼:一個用於字符串字面, 編譯器和填充buf時所用的一個程序。如果這些不是 相同,則該功能可能無法按預期工作。

至於「默認」的編碼,沒有一個,至少就 爲標準而言; 」基本執行字符 集「是實現定義的。實際上,不使用來自ASCII的編碼的系統(ISO 8859-1似乎是最常見的,至少在歐洲這裏是 )非常罕見。至於編碼,你得到 在buf,這取決於角色來自何處;如果你是 從istream閱讀,這取決於 流中的語言環境imbue d。然而,實際上,幾乎所有這些(UTF-8, ISO8859-x等等)都是從ASCII派生的,並且對於基本執行字符集 (其中的所有字符都與ASCII 相同)其中包括傳統C中合法的所有字符)。因此,對於 "UNB",您可能很安全。 (但對於像"üéâ"之類的東西,幾乎是 肯定不是。)

+0

嗨James,讀到buf的數據直接來自網絡夥伴,他們的數據以EBCDIC編碼。所以如果我想用buf和「UNB」做strstr,我應該將「UNB」格式的ASCII轉換爲相應的EBCDIC值字符串「U + B」。它是否正確? – kai

+0

我喜歡在讀取數據時轉換數據,並在內部堅持使用與ASCII相關的編碼。從理論上講,應該可以在輸入流中嵌入EBCDIC語言環境,並讓它處理所有事情。實際上,EBCDIC語言環境的實現並不多,儘管定義一個新的「codecvt」方面(進行編碼的語言環境的一部分)並不困難,但根據您的閱讀方式,其他解決方案可能是簡單。 –

-1

使用此功能,數據以ASCII編碼。

+0

-1:它在哪裏說的? –

0

strstr應該不會對UTF-8編碼的Unicode字符的問題。

3

你的字符串常數(「UNB」)進行編碼的源文件的編碼,所以它必須在緩衝器的編碼等strstr

1

這兩個字符串參數都必須是相同的編碼。用字符串文字編碼C++源代碼(平臺編碼)。對於Unicode而言,UTF-8的功能還有另一個問題:Unicode具有重音帶有變音符號的字母,但這些也可以編碼爲基本字母加上組合變音符號。 可以是一個字母[é]或兩個:[e] + [combined-']。規範化存在。

對於Java它正在成爲遠期(一個很沉默的發展)的源編碼明確設置爲UTF-8。對於C++項目,我不知道這樣的約定變得普遍。