簡體   English   中英

從char轉換為char16_t

[英]convert from char to char16_t

我的配置:

  • 編譯:gnu gcc 4.8.2
  • 我用C ++ 11編譯
  • 平台/操作系統:Linux 64位Ubuntu 14.04.1 LTS

我有這個方法:

static inline std::u16string StringtoU16(const std::string &str) {
    const size_t si = strlen(str.c_str());
    char16_t cstr[si+1];
    memset(cstr, 0, (si+1)*sizeof(char16_t));
    const char* constSTR = str.c_str();
    mbstate_t mbs;
    memset (&mbs, 0, sizeof (mbs));//set shift state to the initial state
    size_t ret = mbrtoc16 (cstr, constSTR, si, &mbs);
    std::u16string wstr(cstr);
    return wstr;
}

我想要char到char16_T之間的轉換(通過std :: string和std :: u16string來促進內存管理)但是無論輸入變量str的大小如何,它都只返回第一個字符。 如果str =“Hello”,它將返回“H”。 我不確定我的方法有什么問題。 ret的值是1。

我不知道mbrtoc16()一次只能處理一個字符..什么是烏龜。 這是我生成的代碼,就像一個魅力:

static inline std::u16string StringtoU16(const std::string &str) {
    std::u16string wstr = u"";
    char16_t c16str[3] = u"\0";
    mbstate_t mbs;
    for (const auto& it: str){
        memset (&mbs, 0, sizeof (mbs));//set shift state to the initial state
        memmove(c16str, u"\0\0\0", 3);
        mbrtoc16 (c16str, &it, 3, &mbs);
        wstr.append(std::u16string(c16str));
    }//for
    return wstr;
}

對於它的對應物(當需要一種方式時,遲早會需要另一種方式):

static inline std::string U16toString(const std::u16string &wstr) {
    std::string str = "";
    char cstr[3] = "\0";
    mbstate_t mbs;
    for (const auto& it: wstr){
        memset (&mbs, 0, sizeof (mbs));//set shift state to the initial state
        memmove(cstr, "\0\0\0", 3);
        c16rtomb (cstr, it, &mbs);
        str.append(std::string(cstr));
    }//for
    return str;
}

請注意,如果某個字符無法從char16_t轉換為char(可能最終根據您的系統打印出一堆'?'),c16rtomb將會有損,但它可以正常工作而不會抱怨。

mbrtoc16()轉換單個字符,並返回為轉換char16_t而消耗的多字節字符數。

為了實現這種轉換,一般方法是:

A)調用mbrtoc16()。

B)保存轉換后的字符,跳過消耗的字符數。

C)你是否消耗了想要轉換的整個字符串? 如果不是,請返回步驟A.

此外,可能存在轉換錯誤。 您必須檢查mbrtoc16()的返回值並執行您想要執行的操作,以處理轉換錯誤(原始多字節字符串是注釋有效)。

最后,您不應假設char16_t字符串的最大大小等於或小於多字節字符串的大小。 它可能是; 但是,在一些奇怪的地方,我認為它理論上可以更多。

暫無
暫無

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

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