gpt4 book ai didi

c++ - 使用固定编码的字符串到字节序列的转换,最好是 UTF-8

转载 作者:可可西里 更新时间:2023-11-01 14:37:49 28 4
gpt4 key购买 nike

在 Windows C++ 控制台应用程序中,我想从命令行输入中读取密码。密码用于加密(以及后来的解密,可能在世界其他地方的 Windows PC 上使用不同的语言环境)。所以我担心该密码的语言环境和编码没有给出相同的数字表示。在同一台计算机或具有相同语言环境的计算机上,这显然不会产生问题。

因此我希望能够固定编码(并规范化?)并存储为 UTF-8。这里推荐:http://www.jasypt.org/howtoencryptuserpasswords.html (第 4 点)。

有很多与编码/unicode/UTF-8/codepages 相关的问题我没有完全(或完全没有)掌握。我摆弄了 boost:locale 和 boost::nowide,但无法弄清楚或者它在 Windows 下不起作用(不知道)。一些链接对所涉及的问题(窗口)进行了更多说明:

http://alfps.wordpress.com/2011/11/22/unicode-part-1-windows-console-io-approaches/

http://alfps.wordpress.com/2011/12/08/unicode-part-2-utf-8-stream-mode/

但是这些链接解决了相反的问题!无论底层表示如何,如何使事物看起来都一样,我需要相同的底层 [按位] 表示,无论它看起来如何!

所以问题是,我如何确保(并且我必须这样做?)语言环境/编码对加密的基本数据没有影响,数据,如 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 后端)一起使用。

最佳答案

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

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

关于c++ - 使用固定编码的字符串到字节序列的转换,最好是 UTF-8,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12330672/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com