2016-07-15 12 views
0

のようなUnicodeを割り当てる方法wchar_t変数に割り当てる方法はありますか?wchar_t変数へのUnicodeの割り当て

+2

'wchar_t型変数= L '\ u1234'; '(1234を目的のUnicodeコードポイントに置き換えます)。 –

+0

@IgorTandetnikは絶対に正しいです、それを行うための唯一の確実な方法です。また、Unicodeのコードポイント値を見つける必要がある場合は、Googleにそれを伝えてください。例えば、ここに矢印のページがあります:https://en.wikipedia.org/wiki/Template:Unicode_chart_Arrows –

+1

'wchar_t'が16であるため、charリテラルの直接割り当てはU + 10000以上のコードポイントに対してWindowsでは動作しません-ビット。このような場合、2つの 'wchar_t'を占めるサロゲートペアを使用する必要があります。 – Sergio

答えて

0

wchar_t Linuxでは32ビットですが、Windowsでは16ビット、UTF-16LEエンコーディング、場合によっては2つのUnicodeコードポイントを格納するwchar_tが必要になることがあります。

UTF-16LEとUTF-16BEは線形ではなく、2つの文字列で分割できないペアがあります。そして、wchar_tは移植性がありません。

したがって、UTF-8とcharを使用する方が良いです。以下のようなWindowsの何かのワイド文字(UTF-16)については

void append_utf8(string& s, uint cp) { 
    if (cp < 0x80 && cp != 0) { 
     // Let encode U+0 too (Modified UTF-8), as non-terminator? 
     s.append(1, (char) cp); 
    } else { 
     char cpBytes[6]; 
     int bi = 0; 
     int lastPrefix = 0xC0; 
     int lastMask = 0x1F; 
     for (;;) { 
      int b = 0x80 | (cp & 0x3F); 
      cpBytes[bi] = (char)b; 
      ++bi; 
      cp >>= 6; 
      if ((cp & ~lastMask) == 0) { 
       cpBytes[bi] = (char) (lastPrefix | cp); 
       ++bi; 
       break; 
      } 
      lastPrefix = 0x80 | (lastPrefix >> 1); 
      lastMask >>= 1; 
     } 
     while (bi > 0) { 
      --bi; 
      s.append(1, cpBytes[bi]); 
     } 
    } 
} 

string s; 
append_utf8(s, 0x2191): // For U+2191 up arrow. 
append_utf8(s, 0x1F913): // For U+01F913 emoji nerd face. 

void append_wch(std::wstring& s, uint cp) { 
    if (cp < 0x10000) { 
     s.append(1, (wchar_t) cp); 
    } else { 
     cp -= 0x10000; 
     uint w = (cp >> 6) + 0xD800; 
     s.append(1, (wchar_t) w); 
     w = (cp & 0x3FF) + 0xDC00; 
     s.append(1, (wchar_t) w); 
    } 
} 

(。私は、Javaの影響で汚染されていますマインド)

+1

Windows APIはUTF-16なので、そのプラットフォームでUTF-8を使用するには余分な作業が必要です。 http://utf8everywhere.org/ –

+0

@MarkRansomはいWindowsのみのデスクトップ開発は、OPが望んでいるものかもしれません。ありがとう –

関連する問題