初歩的な質問をさせて下さい。
Cygwin Beta20.1をWin95環境で使用しています。
例えば
printf("ソ\n");
のように、2バイト目が0x5Cとなる文字を出力する
と文字化けしてしまいます。
Cygwinでは、これを回避するgccのオプション等、
或いは他の2バイト文字処理方法はないのでしょう
か?
よろしくお願いします。
私も分からないので,伺わせて下さい.
開発ツールは全然いじってなく,
bashと付属するコマンド群を利用している程度の者です.
hiragi_homeさんの<eOUwp7So#GA.360@cpmsnbbsa03>から
>平木@小松工業高です。
>
>Cygwin Beta20.1をWin95環境で使用しています。
>
そもそも,日本語を扱えるのでしょうか?
--
SUZUKI Hitoshi<suzu...@mail.ne.jp>
http://www.on.rim.or.jp/~nmnet/suzuki-h/
>>>> On Tue, 18 May 1999 22:12:26 +0900,
"hiragi_home" <hirag...@email.msn.com> said:
> 初歩的な質問をさせて下さい。
> Cygwin Beta20.1をWin95環境で使用しています。
> 例えば
> printf("ソ\n");
> のように、2バイト目が0x5Cとなる文字を出力する
> と文字化けしてしまいます。
Cygwin ではありませんが、embedded 用の仕事で同じような経験し
ました。(私が引っ掛かった訳じゃありませんが)
パーサの shift-jis 対応なんて面倒な事は、日本人だってイヤな
んだから、外国人がやってくれてる訳ないでしょうね…
> Cygwinでは、これを回避するgccのオプション等、
> 或いは他の2バイト文字処理方法はないのでしょうか?
その場しのぎじゃダメですかね。私はそうしました。
printf("ソ\\n");
でも、これが文字化け程度ならともかく、
/*サシスセソ*/
hogehoge();
/*owatta*/
なんてコードだと悲惨なので(これも経験あり :.;)、
コーディング者に shift-jis 使用禁止令を出すのが良いと思います。
≡ [□] ■ | ----------------------------------------
≡ [□] ■ 加藤 満 [ KATO Mitsuru ]
≡ [□]■ | シャープ(株) AVシステム事業本部
~ [□] | ■ mailto: mit...@imgsl.mkhar.sharp.co.jp
根本的には、コンパイラのソースを入手して、"" 内の文字列の解釈を
行う部分を sjis文字列に対応するように修正するしかないと思います。
ほかには、sjis文字の2バイト目の '\' を '\\' で置き換えるようにして、
例) printf("ソ\ース\n");
とすると、正常に表示されます。私は、この作業を自動的に行う簡単な
前処理ソフトを作って、cygwin で日本語を表示させています。
---------------------------------
宮坂 賢 (Miyasaka, Masaru)
Asahikawa-City, Hokkaido, Japan
e-mail : alk...@coral.ocn.ne.jp
それはそうですね。0x5c は '\' ですから、次の \n の \ と
合わさって('\\')表示時には '\' に化けてしまいます。
つまり、「ソの1バイト目」+ '\' + 'n' になるわけです。
> Cygwinでは、これを回避するgccのオプション等、
> 或いは他の2バイト文字処理方法はないのでしょう
> か?
gcc 自体が日本語コード(Shift-JIS)については対応していない
ですから、
1. printf("ソ\\n"); と問題がある部分を '\' で補う。ただし、
これは 0x5c の場合だけで、2バイト目が " や '、また printf
の場合は % も '\' でエスケープする必要があります。この
場合、2バイト文字の1バイト目と2バイト目の間に '\' を
挿入することになるので、エスケープすることで正常に動く
かもしれませんが、ソースコード自体が文字化けすることでしょ
う。
2. 日本語文字列は Shift-JIS ではなく EUC で書いて、出力時に
Shift-JIS に変換する。これも Windows では EUC を表示でき
るエディタを使わないと日本語の部分は文字化けしますね。
3. 日本語を使わない。
4. VC++ など日本語にちゃんと対応したコンパイラを使う。
のどれかかな。
--
-----
Nakano
In article <xoiiu9p...@spls87.ccs.mt.nec.co.jp>,
Toshiyuki Nakano <t-na...@ccs.mt.nec.co.jp> wrote:
>1. printf("ソ\\n"); と問題がある部分を '\' で補う。ただし、
> これは 0x5c の場合だけで、2バイト目が " や '、また printf
> の場合は % も '\' でエスケープする必要があります。この
> 場合、2バイト文字の1バイト目と2バイト目の間に '\' を
> 挿入することになるので、エスケープすることで正常に動く
> かもしれませんが、ソースコード自体が文字化けすることでしょ
> う。
ShiftJIS の 2 byte 目に " や ' や % が来ることはありません。
定義域は 0x40 <= c < 0x7f, 0x7f < c <= 0xfc ですが、これらの
文字は全て 0x40 より小さいですね。
一番汎用性のある対応法としては、日本語文字は全て \ooo 形式
で記述してしまうことです。例えば「ソ」なら 0x835c ですから、
83H = 203O, 5cH = 134O ということで「\203\134」となります。
当然、こういう変換は filter command を自作してということに
なりますが、そう難しい処理でもないでしょう。
>2. 日本語文字列は Shift-JIS ではなく EUC で書いて、出力時に
> Shift-JIS に変換する。これも Windows では EUC を表示でき
> るエディタを使わないと日本語の部分は文字化けしますね。
Windows だったら「UNICODE で書く」というのも手かも ;-p
--
白井 隆 (as Neco)
Toshiyuki Nakano <t-na...@ccs.mt.nec.co.jp> wrote in message news:xoiiu9p...@spls87.ccs.mt.nec.co.jp...
> gcc 自体が日本語コード(Shift-JIS)については対応していない
> ですから、
済みません間違えました、の自己フォロー。
>>>> On 19 May 1999 01:11:05 GMT,
mit...@imgsl.mkhar.sharp.co.jp (KATO Mitsuru) said:
> でも、これが文字化け程度ならともかく、
> /*サシスセソ*/
> hogehoge();
> /*owatta*/
> なんてコードだと悲惨なので(これも経験あり :.;)、
これ、全然勘違いでした。上記例に問題はありません。
私が経験したのは、たしかコメントが閉じたことにならなくなる症
状なんですが、これじゃないですね。
2文字目が'/'とか'*'になるコードなんて shift-jis に無いし。
何と勘違いしたんだろう…
そうでしたか。あまり意識していなかったので。
>> 2. 日本語文字列は Shift-JIS ではなく EUC で書いて、出力時に
>> Shift-JIS に変換する。これも Windows では EUC を表示でき
>> るエディタを使わないと日本語の部分は文字化けしますね。
>
> Windows だったら「UNICODE で書く」というのも手かも ;-p
なるほど。
--
-----
Nakano
ハードウェアは何でしょうか? 外しているかも知れませんが、
日本電気製のPC-98X1上のWindows95では、2バイト文字を
1バイトづつ出力すると問題が起こる、という問題があります。
昔これではまりました。以下のサイトにその情報があります。
http://www.matsusaka-u.ac.jp/~okumura/texfaq/errata2eold.html
http://www.mhttp://www.matsusaka-u.ac.jp/~okumura/texfaq/furukawa.txt
http://www.matsusaka-u.ac.jp/~okumura/texfaq/furukawa.txt
ここにも書かれている通り、Windows95の修正モジュールで直るのですが、
Microsoft や NEC の WEBページからGET出来ませんでした。(当時)
有料サービスであるPC-VANかNIFTYからしか手に入らないと言うことでした。
NECのサポートに電話しましたが「そんなものは知らない」と言われた記憶があります。
"hiragi_home" <hirag...@email.msn.com> writes:
>
> 平木@小松工業高です。
>
> 初歩的な質問をさせて下さい。
> Cygwin Beta20.1をWin95環境で使用しています。
> 例えば
> printf("ソ\n");
> のように、2バイト目が0x5Cとなる文字を出力する
> と文字化けしてしまいます。
「づつ」じゃなくて「ずつ」ですよね。というのは置いといて、
そういう話じゃないのでは。MS漢字コードで「printf("ソ\n");」と書くと、
「ソ」の2バイト目が0x5cなので、コンパイラには「printf("\203\\n");」のよ
うな感じに見え、「\203」と「\」と「n」を出力してしまうという問題なのだと
思います。
解決法は…申し訳ないですが簡単なものは存じません。思いつくのは、cppに
手を入れるとか、対症療法で最初からソースに「printf("ソ\\n");」とか
「printf("\203\\\n");」のように書く方法くらいです。もしかすると環境変数
LANGの設定か何かで解決するのかも知れませんが…
「cppに手を入れる」についてもう少し詳しく書くと、cygwinということなら
bashも使えるのでしょうから、cppのwrapperとして「本物のcppを起動して、そ
の出力を、2バイト文字は全て「\」シーケンスに置き換えるようなフィルタに通
す」というようなシェルスクリプトか何かを書き、それをcppと名付けてどこか
のディレクトリに置いて、そのディレクトリを環境変数GNU_EXEC_PREFIXに指定
する―という方法が、比較的簡単なのではないかと考えます。
# あるいはいっそWindows上でも日本語EUCを使ってしまうとか!?
今回の質問はもちろんのことですが、丁寧な説明をいただ
いて大変勉強になりました。
Cygwinのソースコードが入手できましたので、それとにらめっこ
しながら検討していきたいと思います。
ありがとうございました。
CygWinを使ったことはないですが、『とりあえず、日本語(2バイト文字)を
含む文字列のコンパイルはできるけど、2バイト目が'\'記号(0x5c)になる文字
だけが化ける』ということでしたら、以下のように2バイト目が'\'記号(0x5c)
になる2バイト文字の後に'\'記号をつけてやれば・・・
printf("ソ\\n");
'2バイト文字の第1バイト' + '\\' + '\n'
====
↑
2バイト文字の第2バイト('\')+追加した'\'記号
として解釈してくれるんではないでしょうか?
これが、秋月電子のAKI-H8用のCコンパイラのように、日本語のコメントは
書けるけど、文字列("")内に0x80以降の文字コードが入っているとコンパイル
エラーを出すような場合だと、プリプロセッサなどで文字列を16進コードの
配列に書き換えるといった手間が必要です。
+---------------------------------------------------------------------+
| From : Dairyo Gokan ( 後神 大陵 ) |
| Organization : Studio NAND Co., Ltd. ( スタジオ・ナンド有限会社 ) |
| Address : 39-6-102, Nishi-Kameari 3 Katsushika-ku Tokyo, 125 JAPAN |
| 〒125 東京都葛飾区西亀有3丁目39番6号パールホワイト102 |
| TEL:03-3838-0850 FAX:03-3838-0875 mailto:na...@can.bekkoame.ne.jp |
+---------------------------------------------------------------------+
> >Cygwin Beta20.1をWin95環境で使用しています。
> >
> そもそも,日本語を扱えるのでしょうか?
>
私はCygwinを利用してNTにてXのプログラムを作ったりしています。
時々、コメントや埋め込み文字列に日本語を使います。
ソース コードには日本語EUCを利用しています。
EUCを使えば、いわゆる「8ビットを通すコンパイラ」ならば
(日本語と解釈しているかはともかく)
エラーとならずに処理が進むものだと解釈しています。
>>私が経験したのは、たしかコメントが閉じたことにならなくなる症
>>状なんですが、これじゃないですね。
>>2文字目が'/'とか'*'になるコードなんて shift-jis に無いし。
>>何と勘違いしたんだろう…
C++ スタイルのコメント '//' を使った場合、最後に 0x5C を含む
文字を書いてしまうと、行末をエスケープしてしまって次の行もコ
メントとして解釈してしまうという処理系を見たことがありますが、
それではないでしょうか。
菊池
In article <eOUwp7So#GA.360@cpmsnbbsa03>, hirag...@email.msn.com says...
>Cygwin Beta20.1をWin95環境で使用しています。
(割愛)
>或いは他の2バイト文字処理方法はないのでしょう
>か?
環境が違うので正しいかどうか分かりませんが、
こちらの環境では、Makefileの中に
いったんソースファイルを、eucに変換するルールを
追加しています。
そうして、Shift-JIS のソースを日本語未対応のコンパイラに
通してます。
参考になりますか?
ありがとうございます。
参考になりました。
2バイト目のために処理を施すか、EUCコードを経由するか
いずれにしても、CygwinのgccでSJISコードそのままを
処理する方向ではないようですね。
Takashi SHIRAI <shi...@pon.nintendo.co.jp> wrote in message
news:7htb7o$6uo$1...@yellow.nintendo.co.jp...
> 一番汎用性のある対応法としては、日本語文字は全て \ooo 形式
> で記述してしまうことです。例えば「ソ」なら 0x835c ですから、
> 83H = 203O, 5cH = 134O ということで「\203\134」となります。
> 当然、こういう変換は filter command を自作してということに
> なりますが、そう難しい処理でもないでしょう。
>
実際にdjgpp でこの方法を使って表示させています。
詳しくは、
http://www.nifty.ne.jp/forum/fext/
の導入の手引き内に書いてあるのですが、
cygwinでも使えるかは不明です。
もし、やってみようという方がいらっしゃいましたら言って下さい。
作者の方に折衝してみます。
長谷川 誠 (MXC0...@nifty.ne.jp)
In article <7id12c$sj5$1...@news01dd.so-net.ne.jp>,
Makoto Hasegawa <m-h...@za2.so-net.ne.jp> wrote:
>長谷川です。
>> 一番汎用性のある対応法としては、日本語文字は全て \ooo 形式
>> で記述してしまうことです。例えば「ソ」なら 0x835c ですから、
>> 83H = 203O, 5cH = 134O ということで「\203\134」となります。
>実際にdjgpp でこの方法を使って表示させています。
DJGPP も 1.xx ならば ShiftJIS 対応されているものが出ていま
すね。2.xx の ShiftJIS 対応は見つけられませんでしたが。
因みに、ShiftJIS 対応のものに「表\示」みたいな '\' を追加
したものを食わせると、"\\" のうち後ろの '\' が後続の '\215'
に prefix されると見なされるので
warning: unknown escape sequence: `\' followed by char code 0x8e
と怒られてしまいますが、一応 compile は通りますね。
>詳しくは、
>http://www.nifty.ne.jp/forum/fext/
>の導入の手引き内に書いてあるのですが、
読んでみましたが、これこれの preprocessor を使えば良い、と
書かれているだけで、その preprocessor 内部で何をやってるかは
触れられてませんでした。
>cygwinでも使えるかは不明です。
2byte 目の '\' に '\' を追加するという方法ですと、上記のよ
うに時折不都合の出る場合もありますが、"\ooo" 方式だと C の仕
様を満たす処理系なら compile 失敗することはないと思います。
この方式の有効でない場合というのは、端末に日本語表示機能が
ない場合だけだと思いますよ。"\ooo" 表記で書けば、半角仮名だ
ろうが graphic 文字だろうが何でも表せます。
>もし、やってみようという方がいらっしゃいましたら言って下さい。
>作者の方に折衝してみます。
そんなに大層な program でもないでしょう。5 分で書けますよ。
例えばこんな感じ。
C:> type convsjis.c
#include <stdio.h>
#ifndef issjis1
#define issjis1(c) ((0x81 <= (c) && (c) <= 0x9f)\
|| (0xe0 <= (c) && (c) <= 0xfc))
#endif
main()
{
int c;
while ((c = getchar()) != EOF) {
if (!issjis1(c)) putchar(c);
else {
printf("\\%03o", c);
if ((c = getchar()) == EOF) break;
printf("\\%03o", c);
}
}
}
C:> type sample.sjis
表示
C:> .\convjis < sample.sjis > sample.octal
C:> type sample.octal
\225\134\216\246
C:>
# compile 通りゃいいだけなので comment の日本語も octal 化
#しちゃってますが、さすがに識別子名に日本語は出てきませんよ
#ね。
> DJGPP も 1.xx ならば ShiftJIS 対応されているものが出ていま
> すね。2.xx の ShiftJIS 対応は見つけられませんでしたが。
>
gcc-2.7.2 の物なら知っていますが、それ以降の物は私も知りません。
> 読んでみましたが、これこれの preprocessor を使えば良い、と
> 書かれているだけで、その preprocessor 内部で何をやってるかは
> 触れられてませんでした。
>
8進数に変換しているようです。
長谷川 誠 (MXC0...@nifty.ne.jp)