如何查找带有文件路径的字符串中是否存在任何非ASCII字符

时间:2018-01-11 17:42:28

标签: c++ string unicode utf-8 ascii

检测文件路径中是否存在任何非ASCII字符

我有一个带有UTF-8编码的Unicode字符串,用于存储文件路径,例如 C:\ Users \ myUser \ Downloads \ü.pdf。我已经检查过该字符串在本地文件系统中保存了正确的文件路径,但由于我将此字符串发送到仅支持ASCII的其他进程,因此需要确定该字符串是否包含任何非ASCII字符。

我该怎么做?

2 个答案:

答案 0 :(得分:4)

ASCII字符仅使用char的低7位(值0-127)。以UTF-8编码的非ASCII Unicode字符使用char个元素,这些元素都设置了高位。因此,您可以简单地迭代char元素,看看它们中是否有任何值大于127,例如:

bool containsOnlyASCII(const std::string& filePath) {
  for (auto c: filePath) {
    if (static_cast<unsigned char>(c) > 127) {
      return false;
    }
  }
  return true;
}

有关演员的说明:std::string包含char元素。标准没有定义charsigned还是unsigned。如果它是signed,那么我们可以以明确定义的方式将其投射到unsigned。该标准确切地说明了这是如何完成的。

答案 1 :(得分:0)

正如@CrisLuengo回答强调的几条评论所暗示的那样,我们可以迭代在高位集(live example)中查找任何字符的字符:

#include <iostream>
#include <string>
#include <algorithm>

bool isASCII (const std::string& s)
{
    return !std::any_of(s.begin(), s.end(), [](char c) { 
        return static_cast<unsigned char>(c) > 127; 
    });
}

int main()
{
    std::string s1 { "C:\\Users\\myUser\\Downloads\\Hello my friend.pdf" };   
    std::string s2 { "C:\\Users\\myUser\\Downloads\\ü.pdf" };

    std::cout << std::boolalpha << isASCII(s1) << "\n";
    std::cout << std::boolalpha << isASCII(s2) << "\n";
}
  

是真的