
文字列が書かれたテキストファイルを読み込み、ユニコード部分だけを変換して画面に表示するプログラムを作りたいと思っています。
つまり、
\u305d\u306eaiueo
と書かれたテキストファイルがあれば
そのaiueo(←『\u305d』は『そ』、『\u306e』は『の』なので)
と表示するプログラムを作りたいのですが、fgetsで読み込みprintfで表示するだけではそのまま「\u305d\u306eaiueo」となってしまい困っています。
\を文字(\\)として読み込んでるからだろうとは思うのですが…
また、
char a[]="\u305d\u306eaiueo";
と定義した文字列を
printf("%s",a);
とすると「そのaiueo」と表示されますが、何故こちらは表示されて、前述の方法では表示されないのかも理解できていません。
どのような考え方、方法であれば解決するのでしょうか?
No.5ベストアンサー
- 回答日時:
>wchar_tやmbstowcs関数を使用して『\u305d』→『そ』が表現できるということなのでしょうか?
mbstowcsは使いません。wchar_tは使います。
要するに、『\u305d』を自前で『そ』に変換するんです。
例えば、char *pに\のアドレスが入っているとすると、
if( *p == '\\' && *(p+1) == 'u' ){
p+=2;
wchar_t wc=strtoul(p,&p,0);
:
:
}
とか、そうやって地味に変換するということです。
諸事情で返答が遅れてしまいました、申し訳ありません。
strtoul()なんていう変換関数があったんですね、今回初めて知りました。
wchar_t wc=strtoul(p,&p,0);
だと、「305d」の「d」が変換不可能な文字とみなされてしまったので、基数の0を16として
wchar_t wc=strtoul(p,&p,16);
setlocale(LC_ALL, "");
printf("%wc",wc);
とした所、ちゃんと「そ」と画面に表示することができました。
お陰様で引っかかっていたものがスッキリしました。ありがとうございます!
No.4
- 回答日時:
Visual C++では、国際文字名に相当する部分をいったんwchar_t型に格納してから多バイト文字に変換するのがよいでしょう。
その際、ロケールを適切に設定してください。なお、\u1234の形式であれば簡単ですが、\U00123456の形式の場合には、サロゲートペアに置き換えるなどしなければなりません。
諸事情で返答が遅れてしまいました、申し訳ありません。
\u305dとは異なる形式もあるんですね。「サロゲートペア??」な状態だったので少し調べてみました。
「文字コードは5文字だけどデータは4バイト」
これにも対応するとなるとまた一手間かかりそうですね…
私はほとんど趣味の領域でプログラムを組んでるので対応しなくても全然問題ないですが、
開発者の方達はこういった環境のことも配慮しなくてはいけないとなると大変ですね。
No.3
- 回答日時:
処理系に依存しない一般的な実現方法は、Unicodeの全ての文字に対応した表を作る方法だけです。
> char a[]="\u305d\u306eaiueo";
は国際文字名ですので、\nや??=などと同じで、コンパイル時に実行文字集合に変換されます。
回答ありがとうございます。
>処理系に依存しない一般的な実現方法は、Unicodeの全ての文字に対応した表を作る方法だけです
処理系に依存しないことを考えるとなるとそこまでしないといけないとは…
全ての文字の対応表を作るとしたら本筋とは違う部分に力を注ぐことになりそうなので、今回は避けようと思います。
No.2
- 回答日時:
\の処理はコンパイラがよろしくやってくれる処理です。
コンパイラはソースコードにかかれている文字列については処理してくれますが、さすがにテキストファイルにかかれている文字列の面倒まではみてくれません。
したがって自分のプログラムで処理しなくてはなりません。
一文字ずつ読みながらワイド文字に変換するのが楽だと思います。
あと、処理系が書かれていませんね。
VC++であれはprintfで直接ワイド文字列を出力できますが、他の処理系では一工夫いるかもしれません。
回答ありがとうございます。
処理系ですが、Visual C++ 2008 Express Editionで処理しています。
「一文字ずつ読みながらワイド文字に変換」という部分をプログラムでどう表現してよいのかが、私の頭では思いつきませんでした。
wchar_tやmbstowcs関数を使用して『\u305d』→『そ』が表現できるということなのでしょうか?
(作成してるプログラムの一部でユニコードで書かれたテキストファイルを読む必要が生じたため質問したのですが、改めてプログラム全体を試行錯誤した結果、ユニコードで書かれたテキストファイルの読み込みこむ必要性が無くなりそうです。
とはいえ、この問題を宙ぶらりんにするのも気持ちが悪いので、もしよろしければお教え下さい)
No.1
- 回答日時:
前者は想像の通りで, プログラムで
a[] = "\\u305d\\306eaiueo";
と書いたのと結果的に同じですからねぇ. 後者はコンパイラがよろしくしています.
ということで, 「\u+16進4桁」の部分を実際の値にすればいいんだけど, UTF-8 にしないとダメかなぁ? 後者の方で a[0] の値がわかればなんとかなるかもしれんけど....
回答ありがとうございます。
コンパイラの関係で出力される表現が違っていたわけですか。
これまでソースとファイルに対する扱いは同じようなものだと勝手に思っていました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# [C言語] コメント文字列を無視して、数値データを読み込むプログラム部分について 5 2022/10/05 11:03
- その他(Microsoft Office) エクセル 表の移動 2 2023/04/05 20:29
- Visual Basic(VBA) Excel VBA 書式変更で困ってます。 オートフィルターの日付フィルターを用いて データの絞り込 2 2022/07/26 22:16
- C言語・C++・C# str[j++]の意味 2 2022/08/30 16:20
- WordPress(ワードプレス) WordpressでYouTubeの埋め込みができない。 1 2022/10/26 01:08
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- 数学 (4)のim(T)をu1,u2,u3の線型結合で表せ、という問題がわからないです。回答を見ると私の解 2 2023/05/31 22:14
- その他(IT・Webサービス) HTML コンピューターについて 6 2022/07/12 16:37
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
3のつく数字と3の倍数のみを表...
-
VB6からVB2010への変換について
-
家電製品の電力周波数を変える機械
-
StrConvの使い方について教えて...
-
C++からCへのソース変換について
-
なぜ通信には16進数文字列が使...
-
php
-
三角形を逆三角形にしたいです...
-
VB6で10進数を32進数に変換する...
-
isoをimgに変換したいのですが...
-
VC++2005で、CString型に16進...
-
UTF8→ShiftJISに変換したいです!
-
エクセルVBAの自動変換機能?
-
PHPで、日本語からアルファベッ...
-
OpenCVで画像をある角度から見...
-
ASP.NET SJIS→UTF-8文字コード...
-
C#で漢字→ローマ字を変換
-
BCBプロジェクトをVCに移植
-
逆コンパイルと逆アセンブルの...
-
エクセルのvbaで検索ボタンを作る
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
家電製品の電力周波数を変える機械
-
エクセルVBAの自動変換機能?
-
緯度、経度の 10進法と 60進法...
-
Mac 乗数の入力方法
-
C/C++→JAVAに変換するツール
-
なぜ通信には16進数文字列が使...
-
VB6からVB2010への変換について
-
10進数をBCDに変換する方法
-
画像ファイル変換(Tiff→PDF)
-
エクセルのvbaで検索ボタンを作る
-
分を時間に変換するプログラム
-
StrConvの使い方について教えて...
-
三角形を逆三角形にしたいです...
-
逆コンパイルと逆アセンブルの...
-
VB.NETをJavaに変換するツール...
-
UTF8→ShiftJISに変換したいです!
-
FortranをC++(VC++)へ変換
-
3のつく数字と3の倍数のみを表...
-
c++でmatからvectorへの変換の...
-
C#でのpngからbmpへの変換について
おすすめ情報