在 C++ 中获取拉丁字符

Posted

技术标签:

【中文标题】在 C++ 中获取拉丁字符【英文标题】:Get Latin Character in C++ 【发布时间】:2020-02-18 09:30:15 【问题描述】:

我是 C++ 的菜鸟。我有一个字符串"tỏa",但我无法获得字符'ỏ',为什么该字符串的长度是5?如何将该字符作为变量获取?

void test() 
    std::string str ("tỏa");
    for(int i=0; i<str.length(); ++i)
        std::cout << str[i] << std::endl;
    

该代码的输出是:

t
�
�
�
a

有人可以帮助我吗?提前致谢。

【问题讨论】:

您可能已将文件保存为 UTF-8。在这种情况下,中间字符将用几个字节表示,而不仅仅是单个字节。 @Afshin Yeppp,我把它保存在 UTF-8 中,但是我怎样才能得到像 std::string a = str[i] 这样的字符。谢谢你 你需要阅读这个joelonsoftware.com/2003/10/08/… 【参考方案1】:

使用setlocale()wstring 的组合:

Link to live sample

#include <clocale>
#include <iostream>


void test() 
    std::wstring str = L"tỏa";
    for(int i=0; i<str.length(); ++i)
        std::wcout << str[i] << std::endl;
    
    std::wcout << "Size: " << str.size(); //the size of the string is 3 as it should


int main()
   
    setlocale(LC_ALL, "");
    test();
    return 0;

编辑:

如果你想将宽字符保存在一个变量中,它很简单:

wchar_t ch = str[1];

您也可以使用 ASCII 码:

wchar_t ch = 7887;

注意: 这可能不适用于所有 SO 中的所有编译器,不能保证 100% 的可移植性。

【讨论】:

谢谢你,但如果我想让那个字符不打印?我该怎么办? @BuiNgocBao,这就是你的功能。也许你应该澄清你的问题。 感谢您的帮助。我只是想把它作为一个变量在json文件中找到它,比如“int find = char_dict[std::string(1, input_lines[0][1])];”。 * input_lines[0][1] 是那个字符“ỏ” @BuiNgocBao 您已经拥有正确编码的字符串 int,如果您想使用其中一个字符或子字符串,只需这样做,它就在那里。 你能为我解释更多吗?我是 C++ 的菜鸟。例如 7887 是“ỏ”的字符串 int。如何将 7887 转换为“ỏ”?【参考方案2】:

您可能已将文件保存为UTF-8。在这种情况下,中间字符将用几个字节表示,而不仅仅是单个字节。所以如果你每行打印 1 个字符,你会看到一些奇怪的字符。

如果你只是删除std::endl,你可能会看到你的字符串。因为在这种情况下,控制台可以将字符串处理为 UTF-8 输出(我认为基于 Linux 的控制台默认会这样做)。

注意: 要处理 UTF-8,您可能需要在代码中添加以下内容:

std::setlocale(LC_ALL, "en_US.UTF-8");

【讨论】:

谢谢你,但如果我想让那个字符不打印?我该怎么办?【参考方案3】:

std::string 不适合保存大于 1 个字节的字符:在您的情况下为“ỏ”。

"5" 表示字符串的长度(以字节为单位)。因为 std::string 仍然可以存储像你这样的字符串,但很难以这种方式处理字符串。

尝试使用 std::wstring。

您可以在此处阅读有关宽字符的信息:https://en.wikipedia.org/wiki/Wide_character

【讨论】:

谢谢你,但如果我想让那个字符不打印?我该怎么办?【参考方案4】:

字符 ỏ 是扩展 Ascii 的一部分(请参阅 https://theasciicode.com.ar/extended-ascii-code/letter-o-circumflex-accent-ascii-code-226.html)。

如果您的控制台无法识别 UTF-8,则此类字符(2 个以上字节)将用多个框表示。

您可能想使用std::wstring (http://www.cplusplus.com/reference/string/wstring/) 来解决这个问题。

【讨论】:

谢谢你,但如果我想让那个字符不打印?我该怎么办? 普租。没有“扩展ASCII”之类的东西。不要相信您在互联网上找到的每一个两位站点。 @n.'pronouns'm。 “没有扩展的 ASCII 之类的东西”并不正确。更重要的是,它是人们映射到 8 位字符的高 128 位代码的所有不同编码的一个包罗万象的术语。但话虽如此,我同意任何声称“扩展 ASCII”中的字符存在一个单一答案的网站都不值得一看。我的意思是:在他们自己的历史部分中,他们写道,他们列出的另一个名称是“代码页 437”,好像这并不是暗示存在多个编码。 @Frodyne 如果所讨论的符号确实是“带抑扬符的字母 o”和/或属于那些 8 位“扩展 ASCII”代码页中的任何一个,那只会是半坏的。不是,也不是。这是术语“扩展 ASCII”具有误导性和有害性的一个例子。

以上是关于在 C++ 中获取拉丁字符的主要内容,如果未能解决你的问题,请参考以下文章

拉丁编码字符是不是被认为是 URL 安全的?

在 MySQL 中使用拉丁字符集存储电子邮件和域名

带有重音/拉丁字符的 JSON 请求

在 WP7 上通过 Linq 2 SQL 存储拉丁字符

xml 输出中的非拉丁字符

HTML 表单中的选择和复选框值是不是支持非拉丁字符?