【问题标题】:Check if all characters in UTF16 string are valid?检查 UTF16 字符串中的所有字符是否都有效?
【发布时间】:2023-04-02 00:51:01
【问题描述】:

我有一个问题,我的 UTF16 字符串 (std::wstring) 可能包含“无效”字符,这会导致我的控制台终端停止打印(请参阅 question)。

我想知道是否有一种快速的方法来检查字符串中的所有字符并将任何无效字符替换为?

我知道我可以使用正则表达式按照这些方式做一些事情,但是很难让它验证所有有效的字符,而且速度也很慢。有没有例如我可能使用的字符代码的数字范围,例如26-5466 之间的所有字符代码都有效吗?

【问题讨论】:

    标签: c++ string utf-16


    【解决方案1】:

    应该可以使用std::ctype<wchar_t> 来确定字符是否可打印:

    std::local loc;
    std::replace_if(string.begin(), string.end(),
                    [&](wchar_t c)->bool { return !std::isprint(c, loc); }, L'?');
    

    【讨论】:

    • 应该是“..., u'?')”',而不是 'L'。 “u”代表 16 位,“U”代表 32 位,“L”代表 wchar_t,取决于操作系统,它可以是 16 位或 32 位。因此,为了便于携带,请使用“u”,因为问题是 UTF-16。由于 UTF-16 可以是 2 个或 4 个八位字节。并且 loc 必须先用 loc("en_US.UTF-16") 设置。
    【解决方案2】:

    我怀疑您的问题与字符的有效性无关,而是与控制台打印它们的能力有关。

    UNICODE 对“可打印”的定义不一定与控制台本身“打印”的有效能力一致。

    像“€”这样的字符是“可打印的”,但 - 例如 - 不能在 winXP 控制台上。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-01
      • 2013-02-13
      • 2014-04-09
      • 2023-01-31
      • 2012-02-22
      • 1970-01-01
      • 2019-05-05
      • 2019-10-04
      相关资源
      最近更新 更多