【问题标题】:Detect Unicode Character in string检测字符串中的 Unicode 字符
【发布时间】:2014-04-15 11:49:30
【问题描述】:

我有字符串输入。我想检查所有字符并提示用户输入字符串中是否有任何 Unicode 字符。

如何在 C++ 中进行此验证。

例如。在记事本中,如果您输入任何 Unicode 字符并尝试使用 ANSI 编码保存它,它会提示您输入 Unicode 字符。我想做类似的验证。

【问题讨论】:

  • 您需要指定如何在字符串中存储数据 - 是使用 UTF-8 的 std::string 还是使用 UTF-16 的 std::wstring?您也可能会问该字符是否不能用 7 位 ASCII(或者可能是 8 位 ASCII 加代码页)表示,因为所有 ASCII 字符也有 Unicode 代码点。
  • 如果你认为你可能有一个没有包含Unicode字符的字符串,你几乎肯定需要阅读joelonsoftware.com/articles/Unicode.html
  • 我在 VC++ 中使用 LPTSTR。你说得对。我想检测不能用 8 位 ASCII 或扩展 ASCII 表示的字符。
  • 没有 8 位 ASCII 这样的东西,而 ASCII 有数百种扩展。一种这样的扩展是 UTF-8,它支持所有 Unicode 字符。

标签: c++ visual-c++


【解决方案1】:

您可以使用 IsTextUnicode 函数。据我所知,这是记事本使用的功能。

MSDN 链接: http://msdn.microsoft.com/en-us/library/windows/desktop/dd318672%28v=vs.85%29.aspx

只需插入 NULL 作为最后一个参数。

#include <string>
#include <Windows.h>

int main()
{
  std::string s = "Hallo!";
  std::wstring ws = L"Hello!";

  if (::IsTextUnicode(ws.c_str(), ws.length(), NULL) == 1)
  {
    // is unicode
    int i = 0;
  }
  else
  {
    // no unicode
    int i = 1;
  }

  return 0;
}

【讨论】:

  • 您能否分享链接或任何示例,因为我对最后一个参数感到困惑。
  • 这是一个关于编写文本编辑器的好教程。他还介绍了编码以及如何处理这个问题。 catch22.net/tuts/neatpad
  • 感谢示例代码!!WideCharToMultiByte() 已经解决了确切的要求。
【解决方案2】:

记事本警告您的内容略有不同:它警告您有关无法转换为所需代码页的 Unicode 字符。 IOW,WideCharToMultiByte(CP_ACP, ..., &amp;lpUsedDefaultChar) 导致 lpUsedDefaultChar 设置为 TRUE。

CP_ACP 替换为您想要的编码,CP_UTF8 除外,这没有任何意义。 UTF8 支持所有 Unicode 字符。

【讨论】:

  • 感谢这个解决方案已经解决了确切的要求。
【解决方案3】:

一种简单的方法是允许使用 Unicode 并将文本存储为 UTF-8。由于 UTF-8 是 ASCII 的超集,因此很容易找到非 ASCII 字符(它们设置了高位)。

【讨论】:

    猜你喜欢
    • 2010-12-13
    • 2013-05-27
    • 1970-01-01
    • 2019-04-09
    • 1970-01-01
    • 2019-05-12
    • 2015-07-01
    相关资源
    最近更新 更多