【问题标题】:How to find cyrillic word in text如何在文本中找到西里尔字母
【发布时间】:2021-01-19 13:59:32
【问题描述】:

我正在尝试在如下文本中找到 "пак" 一词:180121-5пак。有西里尔符号。

我尝试使用Pos()函数,但是没有效果。函数返回值 0。

bool f( String Zal )
{
  if ( Zal.Pos(_D("пак")) != 0 || Zal.Pos(_D("УТ")) != 0 )
  {
   smth
  }
  return true;
}

我尝试使用UnicodeString("пак")AnsiString("пак")UTF8String("пак"),但没有结果。

【问题讨论】:

    标签: c++ c++builder


    【解决方案1】:

    "пак" 是一个 narrow 字符串文字,因此受制于将源文件保存为的字符集,以及编译器用来解析源文件的字符集。由于UnicodeString 包含一个 UTF-16 字符串,因此您应该使用 wide 字符串文字,例如:

    Zal.Pos( L"пак" )
    

    但是,UnicodeString 在不同平台上使用不同的数据类型(wchar_t 在 Windows 上,char16_t 在 Posix 上),因此您应该使用 _D() 宏将字符串文字映射到每个平台的正确数据类型您的项目所针对的平台,例如:

    Zal.Pos( _D("пак") )
    

    【讨论】:

    • L_D 不起作用。这意味着L""_D("") 相同
    • @Jacek _D(“”) 在 Windows 上映射到 L””,在 Posix 上映射到 u””。但究竟什么不适合你?你如何设置Zal 开始?请更新您的问题以包含minimal reproducible example
    • if() 条件不返回预期的非零值。包含指定字符串的文件应该在函数if()内删除,但条件不满足
    • @Jacek 您只是在重申问题,但您仍然没有显示如何为Zal 分配其字符数据。 f(_D("180121-5пак")) 应该可以工作,但我怀疑这就是你真正在做的事情。那么实际的输入是什么?
    • UnicodeString a = "180121-5пак"; 错误,它将执行 ANSI 到 Unicode 的转换,从而导致 пак 上的数据丢失。它需要是UnicodeString a = L"180121-5пак";UnicodeString a = _D("180121-5пак"); 以避免任何数据丢失。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-25
    • 1970-01-01
    相关资源
    最近更新 更多