名稱空間
變體
操作

std::wcsrtombs

來自 cppreference.com
< cpp‎ | string‎ | multibyte
在標頭檔案 <cwchar> 中定義
std::size_t wcsrtombs( char* dst,

                       const wchar_t** src,
                       std::size_t len,

                       std::mbstate_t* ps );

將寬字元序列(其第一個元素由 *src 指向)轉換為窄多位元組表示,該表示以 *ps 描述的轉換狀態開始。如果 dst 不為空,則轉換後的字元儲存在由 dst 指向的 char 陣列的連續元素中。寫入目標陣列的位元組數不超過 len

每個字元的轉換都如同呼叫了 std::wcrtomb。轉換在以下情況停止:

  • 已轉換並存儲了空字元。src 被設定為空指標,*ps 表示初始移位狀態。
  • 找到一個 wchar_t,它不對應於當前 C 語言環境中的有效字元。src 被設定為指向第一個未轉換的寬字元。
  • 要儲存的下一個多位元組字元將超過 lensrc 被設定為指向第一個未轉換的寬字元。如果 dst 是空指標,則不檢查此條件。

目錄

[編輯] 引數

dst - 指向窄字元陣列的指標,多位元組字元將儲存在該陣列中
src - 指向以空字元結尾的寬字串的第一個元素的指標的指標
len - dst 指向的陣列中可用的位元組數
ps - 指向轉換狀態物件的指標

[編輯] 返回值

成功時,返回寫入到其第一個元素由 dst 指向的字元陣列的位元組數(包括任何移位序列,但不包括終止空字元 '\0')。如果 dst 為空指標,則返回本應寫入的位元組數(同樣不包括終止空字元 '\0')。

在轉換錯誤時(如果遇到無效的寬字元),返回 static_cast<std::size_t>(-1),將 EILSEQ 儲存在 errno 中,並使 *ps 處於未指定狀態。

[編輯] 示例

#include <clocale>
#include <cwchar>
#include <iostream>
#include <string>
#include <vector>
 
void print_wide(const wchar_t* wstr)
{
    std::mbstate_t state = std::mbstate_t();
    std::size_t len = 1 + std::wcsrtombs(nullptr, &wstr, 0, &state);
    std::vector<char> mbstr(len);
    std::wcsrtombs(&mbstr[0], &wstr, mbstr.size(), &state);
    std::cout << "multibyte string: " << &mbstr[0] << '\n'
              << "Length, including '\\0': " << mbstr.size() << '\n';
}
 
int main()
{
    std::setlocale(LC_ALL, "en_US.utf8");
    // UTF-8 narrow multibyte encoding
    const wchar_t* wstr = L"z\u00df\u6c34\U0001d10b"; // or L"zß水𝄋"
    print_wide(wstr);
}

輸出

multibyte string: zß水𝄋
Length, including '\0': 11

[編輯] 另請參閱

將寬字元轉換為其多位元組表示,給定狀態
(函式) [編輯]
將窄多位元組字元字串轉換為寬字串,給定狀態
(函式) [編輯]
[虛擬函式]
將字串從 InternT 轉換為 ExternT,例如寫入檔案時
(std::codecvt<InternT,ExternT,StateT> 的虛保護成員函式) [編輯]
wcsrtombs 的 C 文件