首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >utfcpp和Win32 wide API

utfcpp和Win32 wide API
EN

Stack Overflow用户
提问于 2010-07-25 23:17:30
回答 2查看 2.6K关注 0票数 4

使用微型utfcpp库将我从wide Windows API (FindFirstFileW等)返回的所有内容转换为使用utf16to8的有效UTF8表示,这样好/安全/可行吗?

我想在内部使用UTF8,但无法获得正确的输出(通过另一个转换后的wcout或普通cout)。正常的ASCII字符当然可以工作,但是ñä被搞乱了。

或者有更简单的替代方案吗?

谢谢!

更新:多亏了Hans (如下所示),我现在可以通过Windows API轻松实现UTF8<->UTF16转换。双向转换可以工作,但是UTF16字符串的UTF8有一些额外的字符,这可能会在以后给我带来一些麻烦...)。纯粹出于友好,我将在这里分享它:) ):

代码语言:javascript
复制
// UTF16 -> UTF8 conversion
std::string toUTF8( const std::wstring &input )
{
    // get length
    int length = WideCharToMultiByte( CP_UTF8, NULL,
                                      input.c_str(), input.size(),
                                      NULL, 0,
                                      NULL, NULL );
    if( !(length > 0) )
        return std::string();
    else
    {
        std::string result;
        result.resize( length );

        if( WideCharToMultiByte( CP_UTF8, NULL,
                                 input.c_str(), input.size(),
                                 &result[0], result.size(),
                                 NULL, NULL ) > 0 )
            return result;
        else
            throw std::runtime_error( "Failure to execute toUTF8: conversion failed." );
    }
}
// UTF8 -> UTF16 conversion
std::wstring toUTF16( const std::string &input )
{
    // get length
    int length = MultiByteToWideChar( CP_UTF8, NULL,
                                      input.c_str(), input.size(),
                                      NULL, 0 );
    if( !(length > 0) )
        return std::wstring();
    else
    {
        std::wstring result;
        result.resize( length );

        if( MultiByteToWideChar(CP_UTF8, NULL,
                                input.c_str(), input.size(),
                                &result[0], result.size()) > 0 )
            return result;
        else
            throw std::runtime_error( "Failure to execute toUTF16: conversion failed." );
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-07-25 23:54:53

Win32应用编程接口已经有一个函数WideCharToMultiByte()来完成此任务,该函数的CodePage = CP_UTF8。使您不必依赖于另一个库。

通常不能将结果与wcout一起使用。它的输出输出到控制台,由于遗留的原因,它使用8位OEM编码。您可以使用SetConsoleCP()更改代码页,65001是UTF-8 (CP_UTF8)的代码页。

您的下一个绊脚石将是控制台使用的字体。你将不得不改变它,但是找到一种固定间距的字体,并且有完整的字形集来覆盖Unicode将是困难的。当你在输出中得到正方形的时候,你会发现你有一个字体问题。问号是编码问题。

票数 7
EN

Stack Overflow用户

发布于 2010-07-25 23:52:45

为什么要在内部使用UTF8?您是否正在处理如此多的文本,以至于使用UTF16会产生不合理的内存需求?即使是这样,你最好还是使用宽字符,并以其他方式处理内存问题(使用磁盘缓存、更好的算法或数据结构)。

您的代码将更加整洁和易于处理,在内部使用Win32应用程序接口原生的宽字符,并且只在读取或写出需要它的数据时才执行UTF8转换(例如。XML文件或REST API)。

在将输出打印到控制台时,也可能会出现问题,请参阅:Output unicode strings in Windows console app

最后,我没有使用utfcpp库,但是使用win32的WideCharToMultiByteMultiByteToWideChar以及CP_UTF8作为代码页来执行UTF8转换是相当简单的。就我个人而言,我会做一次转换,并在UTF16中处理文本,直到需要时以UTF8格式输出或传输它。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3329718

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档