Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用固定编码(最好是UTF-8)进行字符串到字节序列的转换 在Windows C++控制台应用程序中,我想从命令行输入读取密码。密码用于加密(以及以后的解密,可能在世界其他地方的windows pc上使用不同的语言环境)。所以我担心区域设置和密码的编码不能给出相同的数字表示。在同一台计算机或具有相同区域设置的计算机上,这显然不会产生问题_C++_Windows_Unicode_Utf 8_Codepages - Fatal编程技术网

使用固定编码(最好是UTF-8)进行字符串到字节序列的转换 在Windows C++控制台应用程序中,我想从命令行输入读取密码。密码用于加密(以及以后的解密,可能在世界其他地方的windows pc上使用不同的语言环境)。所以我担心区域设置和密码的编码不能给出相同的数字表示。在同一台计算机或具有相同区域设置的计算机上,这显然不会产生问题

使用固定编码(最好是UTF-8)进行字符串到字节序列的转换 在Windows C++控制台应用程序中,我想从命令行输入读取密码。密码用于加密(以及以后的解密,可能在世界其他地方的windows pc上使用不同的语言环境)。所以我担心区域设置和密码的编码不能给出相同的数字表示。在同一台计算机或具有相同区域设置的计算机上,这显然不会产生问题,c++,windows,unicode,utf-8,codepages,C++,Windows,Unicode,Utf 8,Codepages,因此,我希望能够固定编码(和规范化?)并存储为UTF-8。此处建议:(第4点) 有许多与编码/unicode/UTF-8/codepage有关的问题我没有完全(或完全没有)理解。我摆弄了boost:locale和boost::nowide,但弄不清楚,或者它在windows下不工作(不知道)。有关所涉及问题(窗口)的更多说明的一些链接: 但这些链接解决了相反的问题!如何使事物看起来相同无论基础表示是什么,我都需要相同的基础[bit-wise]表示,无论它看起来如何 所以问题是,我如何确保(而

因此,我希望能够固定编码(和规范化?)并存储为UTF-8。此处建议:(第4点)

有许多与编码/unicode/UTF-8/codepage有关的问题我没有完全(或完全没有)理解。我摆弄了boost:locale和boost::nowide,但弄不清楚,或者它在windows下不工作(不知道)。有关所涉及问题(窗口)的更多说明的一些链接:

但这些链接解决了相反的问题!如何使事物看起来相同无论基础表示是什么,我都需要相同的基础[bit-wise]表示,无论它看起来如何

所以问题是,我如何确保(而且我必须这样做吗?)区域设置/编码对加密的基本数据没有影响,就像8位整数数组一样?我不必关心UTF-8或Unicode,只需要能够恢复数据,无论使用何种语言环境/编码。第一个链接有助于解释这个问题

“思想”,C不是Unicode意识,会链接到一些C代码帮助,或者C++会改变这一点吗?或者将输入限制为“ASCII”字符(我知道这在windows上不存在)是否总是有效,就像“在任何windows计算机上”一样

可接受的解决方案:

void EncryptFileNames ( const boost::filesystem::path& p, const std::string& pw );

int main ( int argc, char **argv ) // No checking
{
    // Call with encrypt.exe c:\tmp pässwörd

    boost::nowide::args a ( argc, argv ); // Fix arguments - make them UTF-8

    boost::filesystem::path p ( argv [ 1 ] );

    EncryptFileNames ( p, boost::locale::normalize ( argv [ 2 ], boost::locale::norm_nfc, std::locale ( ) ) );

    return 0;
}
感谢所有捐款人


PS:对于加密,我将Crypto++与VS2008SP1和Boost(不带ICU后端)结合使用。

如果您的应用程序是使用
\u UNICODE
编译的,那么只需使用UTF-8代码页调用
WideCharToMultiByte
,即可获得UTF-8。如果您的应用程序未使用
\u UNICODE
编译,请调用
MultiByteToWideChar
从ACP字节中获取UTF-16,然后调用
WideCharToMultiByte
获取UTF-8


由于添加的代码显示std::string,因此数据可能位于系统的ACP中。所以这里的菜谱会有用的。现在,有很多方便的API用于此目的,例如
mbtowcs
。不要被“MB”分心。这只是Windows所说的“不是UTF-16”。

首先,UTF-8是一种误导。要实现国际化,您必须使用国际字符集,只有一个字符集值得考虑,它叫做Unicode。如何在程序中表示Unicode(即如何编码)取决于您,只要编码可以表示所有Unicode,就没有问题。您可以选择UTF-8,但由于您使用的是Windows,因此选择Windows内部使用的编码(UTF-16)似乎是合理的。正如bmargulies所说,您可以使用MultiByteToWideChar从本地表示(即本地代码页)获取UTF-16。我不认为有必要执行额外的步骤并从UTF-16生成UTF-8,但如果您想这样做,可以使用WideChartMultiByte。

问题中的链接解释了使用固定编码进行转换的必要性。@degski UTF-16是固定编码。您的意思是,在任何具有任何语言环境的windows计算机上,f.e.“ö”或“ä”将始终(内部)用相同的2个字节表示?引用的文章说:“……两个相同的字符串可能用不同的字节序列表示,这取决于翻译所采用的编码(ISO-8859-1、UTF-8等)。”我迷路了。我可能没有抓住要点。@john UTF-16根本不是固定编码。在UTF-16中,代码点通常为4字节,有时为2字节。有关详细信息,请在中搜索“固定宽度”document@RemyLebeau考虑到这一点,degski只关心如何将数据进行Unicode编码。正常化将是下一步。我希望澄清这个问题。您的解决方案是否达到了目标?boost::nowide确实以一种非常简单的方式实现了您的建议,我不确定它是否实现了我所需要的,因为UTF-8也是多字节的。boost::nowide是一件很棒的事情。比MulyBytEoWiDeCar API要好得多,而且C++代码更方便。你真的在乎它是不是多字节,为什么?这是一个cookie-不透明数据-用于您的用例。@Pavel Radzivilovsky是的,您是对的,我不在乎它是什么,只是它[不透明数据]在不同地区的不同计算机上是相同的。@degski,所以选择对您最方便的UTF-8或UTF-16,使用最方便的方法,“我真的不确定问题出在哪里。”德斯基,好吧,我又看了一遍你的帖子,它认为我看到了你的担忧。在从用户那里获得输入后,您不知道该输入是否已“国际化”。恐怕答案是‘视情况而定’。这取决于您是如何从用户那里获得输入的,以及您是如何编译应用程序的。所以唯一的进步是发布你的代码,C和C++都不知道Unicode,所以连接一些C代码不会有什么区别。当然,操作系统库或第三方库可能知道Unicode。我对这两个库都没有经验,但我可以看出上面的代码是错误的。在尝试规范化之前,必须转换为UTF-8。来自boost::locale::normalize documentation’注意:此函数只接收Unicode字符串,即:UTF-8、UTF-16或UTF-32。它不考虑区域设置编码,因为在Unicode字符集之外,Unicode分解和合成是没有意义的。其次,
boost::locale::normalize
不起作用。您必须执行类似于std::string arg2=boost::locale::normalize的操作