C++でUTF-8

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
酢飯

C++でUTF-8

#1

投稿記事 by 酢飯 » 8年前

VS2017CommunityでUTF-8の文字列を変数に入れ、中身を確認したところ、
<文字列中に無効な文字があります>
となってしまい、文字として認識してくれません。

文字列として認識させるにはどのようにすればよいのでしょうか?
よろしくお願いします。

コード:

#include <string>

int main() {
    char buf[] = u8"あいうえお";
    std::string str(u8"あいうえお");
    return 0;
}

アバター
あたっしゅ
記事: 667
登録日時: 14年前
住所: 東京23区
連絡を取る:

Re: C++でUTF-8

#2

投稿記事 by あたっしゅ » 8年前

 Embarcadero® C++Builder 10.1 Berlin バージョン 24.0.25048.9432 で似たプログラムをやってみたところ、

>[bcc32 エラー] File1.cpp(15): E2451 未定義のシンボル u8

と出ました。
 つまり、私の使用したコンパイラも、貴方の使用しているコンパイラも、古くて、C++11 規格に対応していないのでは ?
 VS2017 だと、他のスレッドを読んだ限りでは、「ソースが UTF-8」と指定してやれば、u8 抜きで UTF-8 なリテラルが使えるようですが...
VTuber:
[香車]東上☆Aho(暎帆)☆海美
http://atassyu.php.xdomain.jp/vtuber/index.html
レスがついていないものを優先して、レスするみみ。時々、見当外れなレスしみみ。

中の人:
手提鞄あたッしュ、[MrAtassyu] 手提鞄屋魚有店
http://ameblo.jp/mratassyu/
Pixiv: 666303
Windows, Mac, Linux, Haiku, Raspbery Pi, Jetson Nano, 電子ブロック 持ち。

ISLe
記事: 2650
登録日時: 14年前
連絡を取る:

Re: C++でUTF-8

#3

投稿記事 by ISLe » 8年前

Visual StudioのIDEが文字として認識するのは、ワイド文字(wchar_t)かANSI文字(char)です。

std::stringはANSI文字対応なので、ANSI文字列に変換する必要があります。

文字コードの変換に言語レベルでの標準は無く、下記はWin32 APIを使う場合の例です。

コード:

#include <string>
#include <iostream>
#include <windows.h>

int main()
{
	char buf_utf8[] = u8"あいうえお";
	wchar_t buf_wc[256];// = L"あいうえお";
	char buf_ansi[256];// = "あいうえお";

	// UTF-8文字列からワイド文字列へ変換
	MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, buf_utf8, -1, buf_wc, 256);
	// ワイド文字列からANSI(CP932)文字列へ変換
	WideCharToMultiByte(CP_ACP, 0, buf_wc, -1, buf_ansi, 256, nullptr, nullptr);

	std::string str(buf_ansi);
	std::cout << str << std::endl;
	return 0;
}

YuO
記事: 947
登録日時: 14年前
住所: 東京都世田谷区

Re: C++でUTF-8

#4

投稿記事 by YuO » 8年前

酢飯 さんが書きました:VS2017CommunityでUTF-8の文字列を変数に入れ、中身を確認したところ、
<文字列中に無効な文字があります>
となってしまい、文字として認識してくれません。
ソースコード自体の文字コードは何ですか。

Visual C++のコンパイラは,Windowsのコードページの文字コードとソースコードの文字コードが一致するのであればそのままコンパイルできますが,
そうでないのであれば,/source-charsetのオプションを追加しておく必要があります。
なお,このコンパイラオプションはIDEサポートがないので,上記のリンク先にあるように,直接[追加のオプション]として記述する必要があります。
ref) http://dixq.net/forum/viewtopic.php?f=3&t=17924#p137736
オフトピック
#pragma execution_character_setに相当する,#pragma source_character_setがあれば便利だと思いますが,残念ながら実装されていません。
まぁ,ソースコード中二角場合だと,先頭に書かないといけなかったり(文字コードが途中から変更されるとか混乱の極みなので),ASCII互換必須(UTF-16とかは対応できない),IDEが対応しないといけない(読み込み・保存)などの問題点はありますが。

返信

“C言語何でも質問掲示板” へ戻る