掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.25158

UTF-8→ShiftJISのエンコード変換
投稿者---SS(2006/01/09 20:51:17)


あるファイルから、バイナリで読み込んだデータが次のようにあります。

char buffer[] = {116, 32, -29, -128, -112, 87};

これは、UTF-8エンコーディングで書かれた"st 【W"という文字列をfreadで読み込んだものなのですが、これをShift_JISに直す方法が分かりません。
下記ソースの// (何らかの変換)の部分で、mbstowcs関数やwcstombs関数も使ってみましたが、全く変換されませんでした。

あるchar型文字列について、UTF-8→Shift_JIS変換を行う方法をご教授下さい。御願いします。

#include <stdio.h>

int main(void)
{
  char buffer[] = {116, 32, -29, -128, -112, 87}; // UTF-8の文字列
  char out_buffer[0x100] = {'\0'};
  // (何らかの変換)
  puts(out_buffer); // Shift_JISで出力
  return 0;
}




この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:UTF-8→ShiftJISのエンコード変換 25159 SS 2006/01/09 21:03:04
<子記事> Re:UTF-8→ShiftJISのエンコード変換 25160 επιστημη 2006/01/09 21:09:57
<子記事> Re:UTF-8→ShiftJISのエンコード変換 25162 SS 2006/01/09 21:58:54
<子記事> Re:UTF-8→ShiftJISのエンコード変換 25167 かずま 2006/01/09 22:28:04
<子記事> Re:UTF-8→ShiftJISのエンコード変換 25173 Blue 2006/01/10 00:58:25


No.25159

Re:UTF-8→ShiftJISのエンコード変換
投稿者---SS(2006/01/09 21:03:04)


> char buffer[] = {116, 32, -29, -128, -112, 87}; // UTF-8の文字列

ではなく
char buffer[] = {116, 32, -29, -128, -112, 87, 0}; // UTF-8の文字列
でした
失礼しました


この投稿にコメントする

削除パスワード

No.25160

Re:UTF-8→ShiftJISのエンコード変換
投稿者---επιστημη(2006/01/09 21:09:57)


>これは、UTF-8エンコーディングで書かれた"st 【W"という文字列をfreadで読み込んだものなのですが、これをShift_JISに直す方法が分かりません。
> ...
>あるchar型文字列について、UTF-8→Shift_JIS変換を行う方法をご教授下さい。御願いします。

IBMのUnicodeライブラリ:ICU を使って utf8→Unicode→shift_jis したものです。

#include <unicode/ucnv.h>
#include <stdio.h>
#include <assert.h>

int main() {

 UErrorCode error;
 UConverter* utf8;
 UConverter* sjis;

 char input[] = {116, 32, -29, -128, -112, 87, 0};
 UChar unicode[256];
 char shift_jis[256];
 UChar* utarget;

 error = U_ZERO_ERROR;
 utf8 = ucnv_open("utf-8", &error);
 assert( U_SUCCESS(error) );
 sjis = ucnv_open("shift_jis", &error);
 assert( U_SUCCESS(error) );

 {
  const char* bsource = input;
  utarget = unicode;
  ucnv_toUnicode(utf8, &utarget, utarget+256, &bsource, bsource+strlen(input), NULL, TRUE, &error);
  assert( U_SUCCESS(error) );
  *utarget = L'\0';
 }

 {
  char* starget = shift_jis;
  const UChar* usource = unicode;
  ucnv_fromUnicode(sjis, &starget, starget+256, &usource, utarget, NULL, TRUE, &error);
  assert( U_SUCCESS(error) );
  *starget = '\0';
 }
 printf("[%s]\n", shift_jis);

 ucnv_close(utf8);
 ucnv_close(sjis);

 return 0;
}



この投稿にコメントする

削除パスワード

No.25161

Re:UTF-8→ShiftJISのエンコード変換
投稿者---SS(2006/01/09 21:27:13)


>IBMのUnicodeライブラリ:ICU を使って utf8→Unicode→shift_jis したものです。

実例までつけていただき、ありがとうございます。
解決しました。


この投稿にコメントする

削除パスワード

No.25162

Re:UTF-8→ShiftJISのエンコード変換
投稿者---SS(2006/01/09 21:58:54)


と思ったのですが・・・・

まだ解決しませんでした。
Visual Studio.NET上でのコンパイル・デバッグ動作です。
そのソースをそのままコピー&ペーストし、#include <string.h>を加え、実行したところ、

System.TypeLoadException' のハンドルされていない例外が 不明なモジュールです。 で発生しました。

というエラーメッセージが出てしまいました。

何が間違っているのでしょうか


この投稿にコメントする

削除パスワード

No.25163

Re:UTF-8→ShiftJISのエンコード変換
投稿者---επιστημη(2006/01/09 22:02:30)


>System.TypeLoadException' のハンドルされていない例外が 不明なモジュールです。 で発生しました。
>
>というエラーメッセージが出てしまいました。

コンパイル・オプションは?
僕がこいつをコンパイルしたときは -MD だけでした。



この投稿にコメントする

削除パスワード

No.25164

Re:UTF-8→ShiftJISのエンコード変換
投稿者---SS(2006/01/09 22:17:39)


>コンパイル・オプションは?

すみません、
そもそもコンパイル・オプションをどこでどうやっていじるのかわかりません


この投稿にコメントする

削除パスワード

No.25166

Re:UTF-8→ShiftJISのエンコード変換
投稿者---επιστημη(2006/01/09 22:26:39)


>そもそもコンパイル・オプションをどこでどうやっていじるのかわかりません

え? それでどうやってコンパイルするのですか?
ひょっとしてICUもインストールしてないのかな?
# なにひとつ解決してないやん。 orz



この投稿にコメントする

削除パスワード

No.25168

Re:UTF-8→ShiftJISのエンコード変換
投稿者---SS(2006/01/09 22:30:59)


>ひょっとしてICUもインストールしてないのかな?
いえ、ICUはhttp://www-306.ibm.com/software/globalization/icu/downloads.jsp
からVisual Studio.NET用のをダウンロードして、標準のインクルードディレクトリやらライブラリディレクトリやらにそれぞれ置きました。

プロジェクトのプロパティの「リンカ」にライブラリとのリンクも行いました。
dllはプロジェクトと同じディレクトリに置いてあります。

なので、プログラムは動き始めるんですが、先のエラーが出て異常終了します。


この投稿にコメントする

削除パスワード

No.25169

Re:UTF-8→ShiftJISのエンコード変換
投稿者---επιστημη(2006/01/09 22:35:38)


>なので、プログラムは動き始めるんですが、先のエラーが出て異常終了します。

ごめんなさい、コマンドラインからのコンパイルでは再現できません。
かずまさんの解法を試してはいかがでしょ。



この投稿にコメントする

削除パスワード

No.25170

Re:UTF-8→ShiftJISのエンコード変換
投稿者---SS(2006/01/09 22:55:42)


>ごめんなさい、コマンドラインからのコンパイルでは再現できません。
>かずまさんの解法を試してはいかがでしょ。

お手数をかけました。
ありがとうございます。かずまさんの方法でやってみます。


この投稿にコメントする

削除パスワード

No.25171

Re:UTF-8→ShiftJISのエンコード変換
投稿者---επιστημη(2006/01/09 23:14:40)


>なので、プログラムは動き始めるんですが、先のエラーが出て異常終了します。

お試しに Visual Studio 2003 IDE でコンソールアプリ仕立ててコード放り込んだらあっさり動いてくれたんすけど…わがんね orz



この投稿にコメントする

削除パスワード

No.25167

Re:UTF-8→ShiftJISのエンコード変換
投稿者---かずま(2006/01/09 22:28:04)


> これは、UTF-8エンコーディングで書かれた"st 【W"という文字列をfreadで
> 読み込んだものなのですが、これをShift_JISに直す方法が分かりません。

"st 【W" ではなく、"t 【W" ではありませんか?

Borlan C++ Compiler と Visual C++ で動くプログラムを次に示します。
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>

void utf2ucs(wchar_t *u2, const char *u8)
{
    do {
        int c = *u8++;
        if ((c & 0x80)==0) *u2 = c;
        else if ((c & 0xe0)==0xc0) *u2 = (c & 0x1f) << 6 | (*u8++ & 0x3f);
        else *u2 = (c & 0x0f) << 12 | (*u8 & 0x3f) << 6 | (u8[1] & 0x3f), u8 += 2;
    } while (*u2++);
}

int main(void)
{
    static char utf8[] = { 116, 32, -29, -128, -112, 87, 0 };
    wchar_t ucs2[100];  char sjis[200];

    setlocale(LC_CTYPE, "");
    utf2ucs(ucs2, utf8);
    wcstombs(sjis, ucs2, 200);
    puts(sjis);
    return 0;
}

バッファオーバーフローのチェックなどは省略しています。


この投稿にコメントする

削除パスワード

No.25173

Re:UTF-8→ShiftJISのエンコード変換
投稿者---Blue(2006/01/10 00:58:25)


Win32 API を使用してよいのならば、

WideCharToMultiByte
MultiByteToWideChar

あたりの関数を使ってみてはどうでしょうか?

また、IEのバージョンにもよるらしいですが、
mlang APIs の ConvertINetString をつかうという方法もあります。


この投稿にコメントする

削除パスワード

No.25174

Re:UTF-8→ShiftJISのエンコード変換
投稿者---επιστημη(2006/01/10 01:12:34)


>また、IEのバージョンにもよるらしいですが、
>mlang APIs の ConvertINetString をつかうという方法もあります。

# 手前味噌
そこいらへんのネタ、Cマガ2月号に。



この投稿にコメントする

削除パスワード

No.25177

Re:UTF-8→ShiftJISのエンコード変換
投稿者---Blue(2006/01/10 01:29:44)


>そこいらへんのネタ、Cマガ2月号に。
2006年2月号ですか?

手に入れれたら(購入するとは限らないかもw)
前に別スレでUTF-8変換の話題が出たときに適当にやってみたのが正しいかったのかとか検証してみよ。
# (DetectInputCodepageをつかうための)IMultiLanguage2Ptrの扱いが微妙そうなので。


この投稿にコメントする

削除パスワード

No.25182

Re:UTF-8→ShiftJISのエンコード変換
投稿者---επιστημη(2006/01/10 01:45:14)


>>そこいらへんのネタ、Cマガ2月号に。
>2006年2月号ですか?

です。 ICUとbabelとmlangで iso-2022-jp→shift_jis します。

>手に入れれたら(購入するとは限らないかもw)

いや〜ん ^^;;;



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧