在Windows c ++控制台应用程序中,我想从命令行input中读取密码。 密码用于encryption(以及后来的解密,也许在世界上其他地区的windows pc上的其他地方)。 所以我担心该密码的语言环境和编码不会给出相同的数字表示。 在同一台计算机或具有相同语言环境的计算机上,这显然不会产生问题。
因此,我想能够固定编码(和正常化?)并存储为UTF-8。 这是推荐在这里: http : //www.jasypt.org/howtoencryptuserpasswords.html (点4)。
有很多关于编码/ unicode / UTF-8 /代码页我没有完全(或完全没有)把握的问题。 我摆弄boost:locale和boost :: Nowide,但无法弄清楚,或者它不能在windows下工作(dunno)。 有些问题的链接(窗口)涉及更多的澄清:
Unicode part 1: Windows console I/O approaches
Perl的Unicode毛刺
Codepage 850工作,65001失败! 没有回应“call foo.cmd”。 内部命令工作正常
从Java代码页1252(Windows)转换为Java
如何防止非Unicode应用程序在不同本地化的计算机上加载资源字符集时转换资源字符集?
Unicode part 2: UTF-8 stream mode
但是这些链接解决了相反的问题! 无论底层表示如何让事物看起来都一样,无论它看起来如何,我都需要相同的[按位]表示。
所以问题是,如何确保(以及我必须?)区域设置/编码对获取encryption的基本数据,数据(如8位整数数组)的意义没有影响? 我不需要关心UTF-8或Unicode,只需要能够恢复数据,不pipe是什么区域设置/编码。 第一个链接有助于解释这个问题。
想法,C不是Unicode的意识,会链接在一些C代码的帮助,还是C ++改变,然后呢? 或者将input限制为“ASCII”字符(我知道,在Windows上不存在)总是,如在任何Windows计算机上)工作?
接受的解决scheme:
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:对于encryption,我使用VS2008SP1和Boost(无ICU后端)的Crypto ++。
在哪个Windows版本中,Windows ANSI Western(cp 1252)首次出现?
使用MME和DirectMusic时的ANSI或OEM代码页?
如何检测UTF8文本的等效Windows代码页
cmd.exe启动时使用的编码/代码页是什么?
首先UTF-8是一个红鲱鱼。 要成为国际化的,你必须使用国际字符集,只有一个值得考虑,它被称为Unicode。 如何在程序中表示Unicode(即如何对其进行编码)取决于您,只要编码可以表示所有的Unicode就没有问题。 你可以选择UTF-8,但是因为你在Windows上工作,所以选择内部使用的UTF-16编码似乎是合理的。 bmargulies说你可以使用MultiBytetoWideChar从本地表示(即本地代码页)获取UTF-16。 我没有看到需要做额外的步骤,并从UTF-16生成UTF-8,但如果你想这样做,你可以使用WideCharToMultiByte。
如果您的应用程序是使用_UNICODE编译的,那么只需使用UTF-8代码页调用WideCharToMultiByte即可获得UTF-8。 如果您的应用程序未使用_UNICODE编译,请调用MultiBytetoWideChar从您的ACP字节中获取UTF-16,然后调用WideCharToMultiByte以获取UTF-8。
由于您添加的代码显示为std :: string,因此数据大概在系统的ACP中。 所以这里的食谱将工作。 现在,有很多便利的API用于这个目的,比如mbtowcs 。 不要被“MB”分心。 这只是Windows,而不是UTF-16。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。