ユニバーサル文字名から数値の変換

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

ユニバーサル文字名から数値の変換

#1

投稿記事 by 焼肉 » 2年前

お世話になっております。
現在、ビットマップフォントを使用する関係でユニバーサル文字名から数値の変換を試しているのですが、うまくいきません。

コード:

std::string c = "鳥";//40165(9CE5)
		char c2[] = u8"\u9CE5";//u8"\u9F3B";
		int byte = std::strlen("鳥");//std::strlen("鼻");//std::strlen("鼻");// 3byte
		LONG num = (LONG)(c.c_str());// 
		DrawFormatString(3,30,GetColor(255,255,255),"char c1: %s c2: %s num %ld byte %d", c.c_str(), c2, num, byte);
// 出力 char c1: 鳥 char c2:鳥 num 10891008 byte 3

コード:

std::string c = "鼻";// 40763(9F3B)
		char c2[] = u8"\u9F3B";
		int byte = std::strlen("鼻");//std::strlen("鼻");//std::strlen("鼻");// 3byte
		LONG num = (LONG)(c.c_str());
		DrawFormatString(3,30,GetColor(255,255,255),"char c1: %s c2: %s num %ld byte %d", c.c_str(), c2, num, byte);
// 出力 char c1: 鼻 char c2:鼻 num 10891024 byte 3

ttps://www.marbacka.net/msearch/tool.php#str2enc

↑のサイトですと正常に変換できるので何かありそうなのですが、何かヒントでも良いので教えてくださると助かります。

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: ユニバーサル文字名から数値の変換

#2

投稿記事 by みけCAT » 2年前

UTF-8の形式に基づいて変換をするのがいいでしょう。
UTF-8 - Wikipedia

コード:

#include <cstdio>
#include <string>
#include <cstring>

long utf8_to_int(const char* data) {
	if ((data[0] & 0x80) == 0x00) {
		return data[0];
	} else if ((data[0] & 0xe0) == 0xc0) {
		return ((data[0] & 0x1f) << 6) | (data[1] & 0x3f);
	} else if ((data[0] & 0xf0) == 0xe0) {
		return (static_cast<long>(data[0] & 0x0f) << 12) | ((data[1] & 0x3f) << 6) | (data[2] & 0x3f);
	} else if ((data[0] & 0xf8) == 0xf0) {
		return (static_cast<long>(data[0] & 0x07) << 18) | (static_cast<long>(data[1] & 0x3f) << 12) | ((data[2] & 0x3f) << 6) | (data[3] & 0x3f);
	} else {
		// invalid
		return 0;
	}
}

int main(void) {
	std::string c = "鳥";//40165(9CE5)
	char c2[] = u8"\u9CE5";//u8"\u9F3B";
	long num = utf8_to_int(c2);
	int byte = std::strlen("鳥");//std::strlen("鼻");//std::strlen("鼻");// 3byte
	printf("char c1: %s c2: %s num %ld byte %d", c.c_str(), c2, num, byte);
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

焼肉(解決済み)

Re: ユニバーサル文字名から数値の変換

#3

投稿記事 by 焼肉(解決済み) » 2年前

char c2[] = u8"\u9CE5";
printfDx("%d %d %d\n", (int)(c2[2])+256, (int)(c2[1])+256, (int)(c2[0])+256);
// 165 179 233
// A5 B3
char c3[] = u8"\u9F3B";
printfDx("%d %d %d", (int)(c3[2])+256, (int)(c3[1])+256, (int)(c3[0])+256);
// 187 188 233
// BB BC

自分も同じ答えに辿り着きました!
ありがとうございます!

返信

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