【问题标题】:Compare unicode string with c ++ sign?将unicode字符串与c ++符号进行比较?
【发布时间】:2019-12-25 03:14:34
【问题描述】:

我想要比较后的结果是1,因为两个字符串完全一样,不明白为什么是0,怎么处理?

string s1="\"Kilómetro 0,72\"";
s1=s1.substr(1,s1.length()-2);
cout<<s1<<endl;
string s2="Kilómetro 0,72";
cout<<s2<<endl;
if(s1==s2) cout<<1;
else cout<<0;

【问题讨论】:

    标签: c++ arrays string utf-8


    【解决方案1】:

    因为你的两个字符串不一样。 (注意s2o 上的重音偏移。)这个有效:

    #include <string>
    #include <iostream>
    int main()
    {
      using namespace std;
      string s1="\"Kilómetro 0,72\"";
      s1=s1.substr(1,s1.length()-2);
      cout<<s1<<endl;
      string s2="Kilómetro 0,72";
      cout<<s2<<endl;
      if(s1==s2) cout<<1;
      else cout<<0;
      return 0;
    }
    

    【讨论】:

    • 删除引号时如何比较字符串“Kilómetro 0.72”和字符串 Kilómetro 0.72 之间的返回 true?谢谢
    • @xuhdev 也许我遗漏了一些东西,但您提出的代码看起来与 OP 的问题代码相同。但我tested it 确实产生了不同的结果。请详细说明为什么您的答案在 OP 的代码不起作用的情况下有效。您是否在字符串文字中使用了不同的 Unicode 字符?
    • @RemyLebeau OP的原版在s2中有一个复合字符(拉丁小写字母o + 组合重音),上面的版本是简单的带有锐音的拉丁小写字母o。可能回答者应该解释这一点,而不是仅仅发布神秘的工作代码!
    • 请注意,“重音偏移”取决于浏览器/字体。 OP 的字符串在我的浏览器中看起来是一样的。
    • @MarkTolonen 我也一样
    【解决方案2】:

    您的字符串在视觉上是等效的,但是一个使用带有重音组合的 ASCII o(两个 Unicode 代码点 U+006F、U+0301),一个使用 ó(一个 Unicode 代码点 U+00F3)。

    您需要使用ICU 之类的库对字符串进行normalize 以正确比较它们,或者至少在您的示例中,在两个字符串常量中以相同的方式键入组合字符。

    【讨论】:

      【解决方案3】:

      在最后加上这段代码:

      for(int i = 0; i < s1.length(); i++) {
          cout << (int)(unsigned char)s1[i] << " " << (int)(unsigned char)s2[i] << endl;
      }
      

      它会帮助你。

      【讨论】:

      • 删除引号时如何比较字符串“Kilómetro 0.72”和字符串 Kilómetro 0.72 之间的返回 true?谢谢
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-15
      • 2020-07-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-17
      • 2020-04-15
      • 1970-01-01
      相关资源
      最近更新 更多