簡體   English   中英

已棄用的標頭<codecvt>替代品

[英]Deprecated header <codecvt> replacement

有點前景:我的任務需要將 UTF-8 XML 文件轉換為 UTF-16(當然還有適當的標頭)。 因此,我搜索了將 UTF-8 轉換為 UTF-16 的常用方法,並發現應該使用<codecvt>模板。

但是現在當它被 棄用時,我想知道完成相同任務的新常見方法是什么?

(完全不介意使用 Boost,但除此之外,我更喜歡盡可能接近標准庫。)

別擔心。

根據同一信息來源

這個庫組件應該同時退役到附件 D,直到一個合適的替換被標准化

因此,在新的標准化、更安全的版本完成之前,您仍然可以使用它。

<locale>本身的std::codecvt模板沒有被棄用。 對於 UTF-8 到 UTF-16,仍然存在std::codecvt<char16_t, char, std::mbstate_t>

但是,由於std::wstring_convertstd::wbuffer_convert與標准轉換方面一起被棄用,因此沒有任何簡單的方法可以使用這些方面來轉換字符串。

因此,正如 Bolas 已經回答的那樣:自己實現它(或者您可以像往常一樣使用第三方庫)或繼續使用已棄用的 API。

新方法是……你自己寫。 或者只是依賴已棄用的功能。 希望標准委員會不會真正刪除codecvt,直到有一個功能性的替代品。

但目前,沒有。

由於沒有人真正回答這個問題並提供可用的替換代碼,這里有一個但僅適用於 Windows:

#include <string>
#include <stdexcept>
#include <Windows.h>

std::wstring string_to_wide_string(const std::string& string)
{
    if (string.empty())
    {
        return L"";
    }

    const auto size_needed = MultiByteToWideChar(CP_UTF8, 0, &string.at(0), (int)string.size(), nullptr, 0);
    if (size_needed <= 0)
    {
        throw std::runtime_error("MultiByteToWideChar() failed: " + std::to_string(size_needed));
    }

    std::wstring result(size_needed, 0);
    MultiByteToWideChar(CP_UTF8, 0, &string.at(0), (int)string.size(), &result.at(0), size_needed);
    return result;
}

std::string wide_string_to_string(const std::wstring& wide_string)
{
    if (wide_string.empty())
    {
        return "";
    }

    const auto size_needed = WideCharToMultiByte(CP_UTF8, 0, &wide_string.at(0), (int)wide_string.size(), nullptr, 0, nullptr, nullptr);
    if (size_needed <= 0)
    {
        throw std::runtime_error("WideCharToMultiByte() failed: " + std::to_string(size_needed));
    }

    std::string result(size_needed, 0);
    WideCharToMultiByte(CP_UTF8, 0, &wide_string.at(0), (int)wide_string.size(), &result.at(0), size_needed, nullptr, nullptr);
    return result;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM