![](/img/trans.png)
[英]Why unicode char is stored as UTF-8 in std::string and UTF-16/32 in wchar_t?
[英]Check if UTF-8 is wchar_t or char?
我正在調用zlib API zipOpen
,它從我的C ++項目創建了一個新的zip文件。 函數簽名是extern zipFile ZEXPORT zipOpen (const char* pathname, int append)
。
該調用最終會調用fopen
來創建文件。 但是,此函數不支持寬字符,我想通過發送UTF-8格式(由char *和fit函數簽名表示)並在調用fopen
之前檢查字符串是否包含非ASCII字符來解決此問題,如果沒有,請像以前一樣調用fopen
。 如果是,則轉換為寬字符串(wchar_t)並調用_wfopen
。
所以問題是,是否有一個C / C ++ API檢查UTF-8格式的字符串是否包含非ASCII字符?
基本上,我在下面的示例中尋找類似於isWide
的函數。 我想知道是否使用字符串表示的文件名從Windows api調用fopen
或_wfopen
。
std::string toUTF8(std::wstring str)
{
std::wstring_convert<std::codecvt_utf8<wchar_t>> converter;
return converter.to_bytes(str));
}
...
..
.
std::wstring s1 = L"おはよう";
isWide(toUTF8(s1).c_str()); //this should return true.
string s2 = "asdasd";
isWide(s2); //this should return false.
std::wstring s3 = L"asdasd";
isWide(toUTF8(s3)); //this should return false.
for s in s1,s2,s3 do : //pseudo code, please forgive me :-)
if (isWide(toUTF8(s)))
_wfopen(s,L"wb"); // create wide char file
else
fopen(s,"wb"); // create regular name file
和isWide的功能簽名:
bool isWide(char * s);
如下面的評論所述,之前已經提出過類似的問題,但是標准API並未解決該問題。
謝謝
沒有理由檢查字符串中是否有任何非ASCII字符。 如果您知道它是UTF-8(請注意ASCII是有效的UTF-8),只需對其進行轉換並始終無條件調用_wfopen()
。
這取決於您對“寬”的定義。 如果只想測試是否存在非ASCII字符,則只需測試高位:
bool isWide(const char * s) {
for (; *s; s++) {
if (*s & 0x80)
return true;
}
return false;
}
您可以單步執行所有字符並檢查最高有效位是否為“ 1”。 請參閱: https : //de.wikipedia.org/wiki/UTF-8 ,只有多字節字符設置了該位。
bool isWide(const std::string& string) {
for(auto& c : string)
{
if(c & 0x80) {
return true;
}
}
return false;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.