什么是通过C ++主焦处理不同的字符串编码** args来正确的方法是什么?(What is the

2019-10-22 18:56发布

我需要一些澄清。

问题是我有C ++编写的,它使用“wmain”即接受wchar_t的**作为其具体ARGS窗口函数的窗口的程序。 因此,有通过任何你喜欢的命令行参数这样的程序一个机会:例如,中国符号,日文的,等等,等等。

说实话,我不知道这个功能通常使用的编码信息。 大概UTF-32,或甚至UTF-16。 所以,这些问题:

  • 什么是不特定Windows的,但与标准的主要功能的Unix / Linux的方式来实现这一目标? 我的第一个想法是有关使用某种语言环境指定的UTF-8编码输入字符串的使用情况如何?

  • 有人能给这样的主要功能的一个简单的例子吗? 为std :: string如何保持中国符号?

  • 我们可以使用UTF-8编码,并包含在标准::字符串如常中国符号进行操作的时候,我们刚刚访问每个字符(字节)是这样的:string_object [I]?

Answer 1:

免责声明:提供的所有中国话谷歌翻译服务 。

1)使用正常就继续正常std::string 。 所述std::string可以容纳任何字符编码和参数处理是简单的模式匹配。 所以,在中国电脑与中国版本的程序安装了所有需要做的是中国版本的标志比较一下用户输入。

2)例如:

#include <string>
#include <vector>
#include <iostream>

std::string arg_switch = "开关";
std::string arg_option = "选项";
std::string arg_option_error = "缺少参数选项";

int main(int argc, char* argv[])
{
    const std::vector<std::string> args(argv + 1, argv + argc);

    bool do_switch = false;
    std::string option;

    for(auto arg = args.begin(); arg != args.end(); ++arg)
    {
        if(*arg == "--" + arg_switch)
            do_switch = true;
        else if(*arg == "--" + arg_option)
        {
            if(++arg == args.end())
            {
                // option needs a value - not found
                std::cout << arg_option_error << '\n';
                return 1;
            }
            option = *arg;
        }
    }

    std::cout << arg_switch << ": " << (do_switch ? "on":"off") << '\n';
    std::cout << arg_option << ": " << option << '\n';

    return 0;
}

用法:

./program --开关 --选项 wibble

输出:

开关: on
选项: wibble

3)号

对于UTF-8 / UTF-16的数据,我们需要使用像专业图书馆ICU

对于由字符处理字符,你需要使用或转换为UTF-32。



Answer 2:

简而言之:

int main(int argc, char **argv) { setlocale(LC_CTYPE, ""); // ... }

http://unixhelp.ed.ac.uk/CGI/man-cgi?setlocale+3

然后使用mulitbyte字符串函数 。 您仍然可以使用正常std::string存储字节字符串,但要注意,在这些字符可能跨越多个阵列单元。 设置成功的语言环境后,你也可以用宽流(WCIN,wcout,wcerr)从标准流读写宽字符串。



Answer 3:

1)使用Linux,你会得到标准main()和标准的char 。 它将使用UTF-8编码。 所以,葡萄牙语特定字符包括用多字节编码的字符串中。
***编辑:**对不起,是:你必须设置默认的“”区域设置喜欢这里还有cout.imbue() 。*

2)所有经典main()的例子是很好的例子。 如所述,,葡萄牙语特定字符将包括与多字节编码字符串英寸 所以,如果你清点用默认的UTF8区域设置这样的字符串时,COUT sream将其解释的特殊UTF8编码序列,知道它是为了产生输出,葡萄牙语和2各6间agregate。

3)你可以对字符串如常运作。 如果你清点例如字符串的长度也有一些问题,但是:有内存(例如:3个字节)之间的差异,用户看到的字符(例如:只有1人)。 同样的,如果你有一个指针向前或向后移动。 你必须确保你正确地解释mulrtibyte编码,为了不输出无效编码。

你可能有兴趣在这个其他SO问题 。

维基百科解释了UTF-8多字节编码的逻辑。 从这篇文章你就会明白,任何字符u被编码字符,如果一个字节:

( ((u & 0xE0) == 0xC0)
       || ((u & 0xF0) == 0xE0)
       || ((u & 0xF8) == 0xF0)
       || ((u & 0xFC) == 0xF8)
       || ((u & 0xFE) == 0xFC) ) 

其次是由一个或几个字符,例如:

((u & 0xC0) == 0x80)

所有其他字符的ASCII字符(即不是多字节)。



文章来源: What is the correct way of processing different strings encodings via c++ main char** args?