【问题标题】:How can I parse the Euro symbol from a string?如何从字符串中解析欧元符号?
【发布时间】:2015-10-05 20:13:44
【问题描述】:

我正在尝试为每个字符解析一个字符串字符,以便可以根据每个字母加载图像。因此,如果文本是“你好”,我将打印 5 张相同字母但在 Photoshop 中制作的图像。 在我想解析 € 符号之前,它工作正常。

std::string al = "Test €";

std::string letter="";
for (int i=0; i< al.length();++i)
{
    if (al[i]=='.') letter ="dot";
    else if (al[i]==',') letter ="coma";
    else if (al[i]==' ') letter ="space";
    //else if (al[i]=='€') letter ="euro";
    else letter=al[i];
}

这工作正常:letter 将获取值:"T","e","s","t","space" 但如果我取消注释 else if (al[i]=='€') letter ="euro"; 并尝试构建它,那么我会收到一条红色消息错误:

warning: multi-character character constant

所以问题是我需要知道 al[i] 是否是 € 符号才能将“欧元”分配给字母(然后我的代码将能够使用它)

我在谷歌上搜索发现link"\u20AC" 是€ 的c++ 代码,我想这个符号可能需要超过一个字节,但仍然找不到如何处理使用它并能够在我的代码中解析它。知道我该怎么做吗?

非常感谢。

注意:我不知道使用的 C++ 版本(不知道在哪里可以查看)但我知道它不是 c++11

【问题讨论】:

标签: c++ eclipse fedora


【解决方案1】:

第一个问题是您应该注意在源代码中使用 Unicode 字符。编译器只需要支持特定的字符集,并不是所有的编译器都喜欢你的代码。我建议您阅读this 答案以获得更详细的解释。

第二个问题是字符太大而无法用字符文字表示。您需要明确告诉编译器改用宽字符文字。

L'\x20AC`   // Notice the preceeding L

第三个问题是您的其余代码仍然使用窄字符串。将std::string 更改为std::wstring

【讨论】:

  • 好吧,我以前从来没有遇到过这个问题,所以这是我第一次看到这个问题。 Ofc 我知道有很多类型的编码,但仅此而已,理论。您帮助我了解了我必须更改代码的内容和原因,以及如此简单的步骤和更改。我做到了,现在它工作正常。非常感谢!!!
【解决方案2】:

std::string 假定所有字符都编码在一个字节中。您想要的符号是一个以两个字节编码的 unicode 字符(这就是您收到“多字符字符”错误的原因)

最好的办法是使用理解 unicode 的库并坚持使用该库。这个问题可能是相关的:unicode string in c++ with boost

【讨论】:

    【解决方案3】:

    "\u20AC" 是一个字符串,所以你应该把你的大字符串分成一些子字符串 然后你和他们比较。如果它们相等,则替换它 否则你替换子字符串中的每个字符

    string al = "Test €";  (assume you declared std namespace already) 
    string letter="";
    char* ch = strtok(al," ");
    
    while(ch!=NULL) {
        if(al.compare(ch)==0){ 
            letter="euro";
        }
        //your code here
    }
    

    【讨论】:

    • 我不知道这将如何工作。您从al 中提取substing,然后将其 al.= 进行比较,这样就永远不会有匹配项。除非您在某个时候将 ch 设置为 nullptr,否则您呈现此 while 循环的方式将是无限的。
    猜你喜欢
    • 1970-01-01
    • 2014-03-27
    • 1970-01-01
    • 2016-08-13
    • 1970-01-01
    • 2023-03-03
    • 2016-04-06
    • 2019-06-21
    • 2023-03-28
    相关资源
    最近更新 更多