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

Fra*_*101 5 c++ string unicode ascii utf-8

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

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

我怎样才能做到这一点?

Fra*_*101 8

正如几条评论所建议的以及 @CrisLuengo 答案所强调的,我们可以迭代字符来查找高位集中的任何字符(实时示例):

\n\n
#include <iostream>\n#include <string>\n#include <algorithm>\n\nbool isASCII (const std::string& s)\n{\n    return !std::any_of(s.begin(), s.end(), [](char c) { \n        return static_cast<unsigned char>(c) > 127; \n    });\n}\n\nint main()\n{\n    std::string s1 { "C:\\\\Users\\\\myUser\\\\Downloads\\\\Hello my friend.pdf" };   \n    std::string s2 { "C:\\\\Users\\\\myUser\\\\Downloads\\\\\xc3\xbc.pdf" };\n\n    std::cout << std::boolalpha << isASCII(s1) << "\\n";\n    std::cout << std::boolalpha << isASCII(s2) << "\\n";\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n

真的

\n\n

错误的

\n
\n

  • 尽管这可能不是解决方案,但该函数可以缩短为“return std::all_of(filepath.begin(), filepath.end(), ::isprint);” (3认同)
  • 请注意,“isprint”的行为取决于当前的 C 语言环境。如果有人更改了区域设置,则将不再检查“可打印 ASCII”。至少,我会更改函数的名称以避免混淆。 (2认同)

Cri*_*ngo 7

ASCII 字符仅使用 a 的低 7 位char(值 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;
}
Run Code Online (Sandbox Code Playgroud)

关于演员表的说明:std::string包含char元素。该标准没有定义charsigned还是unsigned。如果是signed,那么我们可以以unsigned明确定义的方式将其转换为 。该标准具体规定了如何做到这一点。