将unicode字符串与c ++符号进行比较?

Posted

技术标签:

【中文标题】将unicode字符串与c ++符号进行比较?【英文标题】:Compare unicode string with c ++ sign? 【发布时间】: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;

【问题讨论】:

【参考方案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?谢谢

以上是关于将unicode字符串与c ++符号进行比较?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用“。”,“?”,“!”计算C中的句子数?

与包含它们的字符集进行比较时,只有 2 个表情符号返回错误的长度

如何将 javascript regexp 中的 Euro € 符号与八进制、十六进制或 unicode 元字符匹配?

将符号链接及其目标与 bash test -ef 进行比较

如何将python字符串更改为无符号字符数组?

shell特殊字符