代码之家  ›  专栏  ›  技术社区  ›  m4tx

STD:波兰字符::字符串

  •  4
  • m4tx  · 技术社区  · 15 年前

    我有问题。我正在为Linux编写一个波兰语应用程序(当然是波兰语字符),编译时收到80条警告。这只是“警告:多字符字符常量”和“警告:大小写标签值超过了类型的最大值”。我使用的是STD::字符串。

    如何替换STD::String类?

    请帮忙。 事先谢谢。 当做。

    3 回复  |  直到 15 年前
        1
  •  4
  •   André Caron    15 年前

    std::string 不定义特定编码。因此,您可以存储 字节 在里面。有一些微妙之处需要注意:

    1. .c_str() 将返回以空结尾的缓冲区。如果字符集允许空字节,请不要将此字符串传递给 const char* 参数没有长度,否则数据将被截断。
    2. char 不代表字符,而是一个**字节 . imho,这是计算历史上最有问题的术语。注意 wchar_t 根据UTF-16标准化,也必须保留一个完整字符。
    3. .size() .length() 将返回 字节 ,而不是字符数。

    [编辑] 关于的警告 case 标签与问题(2)有关。你正在使用 switch 使用类型的多字节字符语句 烧焦 不能容纳多个字节。 [/编辑]

    所以,你 可以 使用 STD::字符串 在你的申请中,只要你遵守这三条规则。STL有一些微妙之处,包括 std::find() 这就是结果。由于规范化表单的存在,您需要使用一些更聪明的字符串匹配算法来正确支持Unicode。

    但是,在用任何使用非ASCII字符的语言编写应用程序时(如果您偏执,请考虑使用外部语言 [0, 128) ,您需要知道不同文本数据源中的编码。

    1. 这个 源文件 可能未指定编码,并且可能会使用编译器选项进行更改。任何字符串文字都将服从此规则。我想这就是你得到警告的原因。
    2. 您将从外部源(文件、用户输入等)获得各种字符编码。当该源指定了编码或者您可以从某个外部源(即询问导入数据的用户)获得编码时,这就更容易了。许多(更新的)因特网协议都采用ASCII或UTF-8,除非另有规定。

    这两个问题没有被任何特定的字符串类解决。您只需要将所有外部源代码转换为内部编码。我一直建议使用utf-8,但特别是在Linux上,因为支持本机。我强烈建议将字符串文本放在消息文件中,以忽略问题(1),只处理问题(2)。

    我不建议使用 std::wstring 在Linux上,因为100%的本地API使用函数签名 常量字符 并拥有 直接的 支持UTF-8。如果使用基于 瓦查特 ,您将需要转换为/来自 STD::WSCON 不停地,最终会出问题,除了让一切变慢。

    如果您正在为Windows编写应用程序,我建议正好相反,因为所有本地API都使用 const wchar_t* 签名。这些函数的ANSI版本执行内部转换 康斯特瓦查特 .

    一些“可移植”库/语言使用基于平台的不同表示。他们使用UTF-8 烧焦 在Linux和UTF-16上 瓦查特 在Windows上。我记得我读过关于Python引用实现中的技巧的文章,但是这篇文章已经很老了。我不确定这是否是真的。

        2
  •  1
  •   Tometzky    15 年前

    在Linux上,您应该使用由您使用的框架提供的多字节字符串类。

    我建议使用glib::ustring,它来自glibmm框架,它以utf-8编码存储字符串。 如果您的源文件是UTF-8格式的,那么在代码中使用多字节字符串就非常容易:

    ustring alphabet("aąbcćdeęfghijklłmnńoóprsśtuwyzźż");
    

    但不能使用 char . 我建议使用一系列 if S.您可以使用glibmm's gunichar ,但它不太可读(您可以从 article on Polish alphabet in Wikipedia ):

    #include <glibmm.h>
    #include <iostream>
    
    using namespace std;
    
    int main()
    {
            Glib::ustring alphabet("aąbcćdeęfghijklłmnńoóprsśtuwyzźż");
            int small_polish_vovels_with_diacritics_count = 0;
            for ( int i=0; i<alphabet.size(); i++ ) {
                    switch (alphabet[i]) {
                            case 0x0105: // ą
                            case 0x0119: // ę
                            case 0x00f3: // ó
                                    small_polish_vovels_with_diacritics_count++;
                                    break;
                            default:
                                    break;
                    }
            }
            cout << "There are " << small_polish_vovels_with_diacritics_count
                    << " small polish vovels with diacritics in this string.\n"; 
            return 0;
    }
    

    您可以使用以下方法编译:

    g++ `pkg-config --cflags --libs glibmm-2.4` progname.cc -o progname
    
        3
  •  -1
  •   Simone    15 年前

    std::string 用于ASCII字符串。既然你的波兰弦不合适,你应该用 std::wstring .