簡體   English   中英

檢查UTF-8是wchar_t還是char?

[英]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.

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