【问题标题】:Adding a diacritic mark to string fail in c++在 C++ 中向字符串添加变音符号失败
【发布时间】:2014-08-24 06:02:52
【问题描述】:

我想在c++ 中的string 中添加一个变音符号。假设我想通过以下方式修改wordz 字符串:

String respj = resp[j];                     
std::string respjz1 = respj;   // create respjz1 and respjz2 
std::string respjz2 = respj;

respjz1[i] = 'ź';   // put diacritic marks
respjz2[i] = 'ż';

我不断收到:wordşwordĽ(而不是 wordźwordż)。我试图用谷歌搜索它,但我不断得到与相反问题相关的结果——变音符号标准化为非变音符号。

【问题讨论】:

  • 你试过使用unicode吗?
  • 这是什么编译器?
  • 检查编译器的编码?
  • 好吧,实际上我通过R 中的Rcpp 插件使用c++ 函数(R 是统计计算的环境)并认为可能有一个c++ 函数来强制正确编码。如果不是,我想这可能是一个更深层次的问题,因为函数是在 R 本身中编译的。
  • 你必须先识别环境编码。然后,您可以使用代码来介绍您想要的角色。请记住,这些字符的编码可能是多字节的。例如,“ź”字符可以用 utf-8 写成"\xe0\x85\xba"(Unicode 字符 U+017A 编码为 utf-8)。

标签: c++ string diacritics


【解决方案1】:

首先,String 是什么?它是否支持重音字符?

但真正的问题是编码之一。当你说“我坚持 接收”,你是什么意思。字符串将包含什么 不是一个字符,而是一个数值,代表一个代码点 一个字符,在某种编码中。如果使用的编码 重音字符的编译器与编码相同 被你用来可视化它们的任何东西所使用,那么你会得到 相同的字符。如果不是,你会得到一些东西 不同的。因此,例如,根据编码,LATIN 带 DOT 的小写字母 Z(我认为您要分配给 respjz2[i]) 在我的编码表中可以是 0xFD 或 0xBF 访问(并且在大多数单字节编码中不存在);在 我通常使用的单字节编码(ISO 8859-1),这些代码 点对应于带有 ACUTE 的拉丁小写字母 Y 和 倒置问号。

最终,没有真正的解决方案。从长远来看,我认为你 应该可能会迁移到 UTF-8,并尝试确保所有 您使用的工具(以及您的用户使用的所有工具) 明白。短期来看,可能没那么简单:因为 初学者,你或多或少地被你的编译器所困扰 提供(除非您以\u00BF 的形式输入字符 或\u00FD,即使这样编译器也可能会做一些有趣的事情 将它们放入字符串文字时的映射)。你可以 甚至不知道您的用户使用了哪些其他工具。

【讨论】:

  • James Kanze,非常感谢您的回答。我要使用的字符集非常少,因此我将尝试执行一些基本映射。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-03
  • 2011-02-03
  • 1970-01-01
  • 2017-05-30
相关资源
最近更新 更多