UTF-8→SHIFT-JISへの変換について。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
Ciel
記事: 252
登録日時: 9年前

UTF-8→SHIFT-JISへの変換について。

#1

投稿記事 by Ciel » 8年前

久しぶりの質問です。

WINAPIのMultiByteToWideCharとWideCharToMultiByteを使って、
UTF-8からSHIFT-JISへの変換を行っているんですが、関数は成功しているっぽいのに変換されません。

コードを貼り付けますので、どこがおかしいのかご指摘願います。

コード:

#include <stdio.h>
#include <windows.h>

int main(void)
{
	//これがUTF-8の文字
	char buf[]="%e3%83%a9%e3%83%ab%e3%82%af%e3%82%a2%e3%83%b3%e3%82%b7%e3%82%a8%e3%83%ab%e3%81%af%e7%a5%9e";

	wchar_t *utf16;
	char *shiftjis;


	int size;

	size=MultiByteToWideChar(CP_UTF8,0,buf,-1,NULL,NULL);

	printf("UNICODE変換に必要なサイズ:%d\n",size);

	utf16=new wchar_t[size+1];

	size=MultiByteToWideChar(CP_UTF8,0,buf,-1,utf16,size);

	if(size==0){
		puts("変換失敗");
		return -1;
	}

	size=WideCharToMultiByte(CP_ACP,0,utf16,-1,NULL,NULL,NULL,NULL);

	printf("SHIFTJIS変換に必要なサイズ:%d\n",size);

	shiftjis=new char[size+1];

	size=WideCharToMultiByte(CP_ACP,0,utf16,-1,shiftjis,size,NULL,NULL);

	if(size==0){
		puts("SHIFTJIS変換に失敗したようです");
		return -1;
	}

	puts("変換成功。表示します\n");

	printf("%s\n",shiftjis);

	return 0;
}
oui C'est la Vie♪

アバター
Justy
副管理人
記事: 122
登録日時: 9年前
住所: 神奈川県

Re: UTF-8→SHIFT-JISへの変換について。

#2

投稿記事 by Justy » 8年前

 久しぶりの回答です。

コード:

unsigned char buf[]={ 0xe3, 0x83, 0xa9, 0xe3, 0x83, 0xab, 0xe3, 0x82 ... };
にしないとうまく utf-8文字を表現出来ないのでは?

アバター
Ciel
記事: 252
登録日時: 9年前

Re: UTF-8→SHIFT-JISへの変換について。

#3

投稿記事 by Ciel » 8年前

Justyさん、お久しぶりです!

おっしゃるとおりそうしないとUTF-8を表現できてないっぽいですね。

ですがちょっとやってみたんですが、unsigned charにすると、
MultiByteToWideChar関数の第三引数がLPCSTR型になっているので、char型じゃないとダメなんですよね。。

でもchar型にしてしまうと、128を超えてるので切り詰められてしまって、正しく表現できなくなってしまいます。

他にも、
char buf[]="0xe3,0x83,0xa9,0xe3,0x83,0xab,0xe3,0x82,0xaf,0xe3,0x82,0xa2,0xe3,0x83,0xb3,0xe3,0x82,0xb7,0xe3,0x82,0xa8,0xe3,0x83,0xab,0xe3,0x81,0xaf,0xe7,0xa5,0x9e";

とか、

char buf[]="0xe30x830xa90xe30x830xab0xe30x820xaf0xe30x820xa20xe30x830xb30xe30x820xb70xe30x820xa80xe30x830xab0xe30x810xaf0xe70xa50x9e";

で、試してみましたが変換されませんでした。
oui C'est la Vie♪

アバター
Justy
副管理人
記事: 122
登録日時: 9年前
住所: 神奈川県

Re: UTF-8→SHIFT-JISへの変換について。

#4

投稿記事 by Justy » 8年前

Ciel さんが書きました:MultiByteToWideChar関数の第三引数がLPCSTR型になっている
 そこはキャストで。

アバター
Ciel
記事: 252
登録日時: 9年前

Re: UTF-8→SHIFT-JISへの変換について。

#5

投稿記事 by Ciel » 8年前

あら?wキャストしちゃっていいんですねw

データがおかしくなってしまうんじゃないかと思ってました。

おかげで上手くいきました。ありがとうございました!

一応完成版のコード貼っておきます。
utf-8の文字の最後にNULL文字(0x00)入れとかないと後ろにゴミが残るようだったので、
入れてあります。

コード:


#include <stdio.h>
#include <windows.h>

int main(void)
{
	//これがUTF-8の文字
	unsigned char buf[]={0xe3,0x83,0xa9,0xe3,0x83,0xab,0xe3,0x82,0xaf,0xe3,0x82,0xa2,0xe3,0x83,0xb3,0xe3,0x82,0xb7,0xe3,0x82,0xa8,0xe3,0x83,0xab,0xe3,0x81,0xaf,0xe7,0xa5,0x9e,0x00};


	//char buf[]="0xe30x830xa90xe30x830xab0xe30x820xaf0xe30x820xa20xe30x830xb30xe30x820xb70xe30x820xa80xe30x830xab0xe30x810xaf0xe70xa50x9e";


	int size;

	wchar_t *utf16;
	char *shiftjis;


	size=MultiByteToWideChar(CP_UTF8,0,(LPCSTR)buf,-1,NULL,NULL);

	printf("UNICODE変換に必要なサイズ:%d\n",size);

	utf16=new wchar_t[size+1];

	size=MultiByteToWideChar(CP_UTF8,0,(LPCSTR)buf,-1,utf16,size);

	if(size==0){
		puts("変換失敗");
		return -1;
	}


	size=WideCharToMultiByte(CP_ACP,0,utf16,-1,NULL,NULL,NULL,NULL);

	printf("SHIFTJIS変換に必要なサイズ:%d\n",size);

	shiftjis=new char[size+1];

	size=WideCharToMultiByte(CP_ACP,0,utf16,-1,shiftjis,size,NULL,NULL);

	if(size==0){
		puts("SHIFTJIS変換に失敗したようです");
		return -1;
	}

	puts("変換成功。表示します\n");

	printf("%s\n",shiftjis);

	return 0;
}
oui C'est la Vie♪

アバター
a5ua
記事: 199
登録日時: 9年前

Re: UTF-8→SHIFT-JISへの変換について。

#6

投稿記事 by a5ua » 8年前

"\xなんとか"で文字コードを16進数表記で直接表現できます。

コード:

char buf[] = "\xe3\x83\xa9\xe3\x83\xab\xe3\x82\xaf\xe3\x82\xa2\xe3\x83\xb3\xe3\x82\xb7\xe3\x82\xa8\xe3\x83\xab\xe3\x81\xaf\xe7\xa5\x9e";

アバター
Ciel
記事: 252
登録日時: 9年前

Re: UTF-8→SHIFT-JISへの変換について。

#7

投稿記事 by Ciel » 8年前

>>a5uaさん

ありがとうございます!

これでいけました!

こっちの方が楽でいいですね!使わせてもらいます^^
oui C'est la Vie♪

閉鎖

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