みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

BCCでの日本語ファイル名の扱い

こんにちは。

現在WindowsVistaで、Borland C++ Compiler 5.5(日本語版)を使い、プログラミングを行っています。
最近、bcc32.exeでソースファイルをコンパイルする際に、ソースファイルの名前に一部の日本語が含まれている場合は、コンパイルできないという事に気が付きました。
例えば、「161_ポインタの基礎.c」というソースファイルをコンパイル使用すると、以下の様にコンパイルエラーになります。

------------------------------------------------------------
>bcc32 -c "161_ポインタの基礎.c"
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
161_ポツンタの基礎.c:
エラー F1009 161_ポツンタの基礎.c: 入力ファイル '161_ポツンタの基礎.c'
をオープンできない
*** 1 errors in Compile ***
------------------------------------------------------------

どうやら、「イ」という文字を、コンパイラが「ツ」と認識してしまっているようです。
こういった問題の解決策をWebで検索したのですが、見つける事ができませんでした。
ちなみに、僕の使っているBCCはすでに日本語版ですので、日本語化が必要というわけではなさそうです。
そこで解決策を御提供頂きたいと思っています。
何でもいいので、よろしくお願い致します。

投稿日時 - 2011-08-10 17:58:52

QNo.6934312

困ってます

質問者が選んだベストアンサー

> bcc32の新しいバージョンを探してみたのですが、5.5.1より新しいものが見つかりませんでした。
これは言葉足らずでした。
Borland C++ 5.6以降については製品版になってしまうので、
無料コンパイラとしては5.5.1版が最後ではないかと思われます。
最近はBorland及びその後継の製品から離れているので明確ではないですが。
# 5.5.1版のbccはPCの片隅にひっそり残ってた(^^;


さらに試しているうちに気付いたちょっと別方法。
includeディレクティブで読み込ませる分には、
bcc32はまともに開いてくれることに気が付いた。

#include "イ.h"

これは"イ.h"を開いてインクルードしてくれる。
つまりコマンドライン引数で渡されるソースファイル名だけ特別扱いしている模様。
そこで、

/* alias161.c */
#include "161_ポインタの基礎.c"

のように、
"161_ポインタの基礎.c"のように化けてしまうファイル一個一個について、
ビルド用にだけ使うエイリアスになるようなファイルを化けない名前で作って、

bcc32 -e161_ポインタの基礎.exe alias161.c

のようにすればコンパイルできる。
-eで指定する出力に関しては化けずに"161_ポインタの基礎.exe"で作成された。

分割ソースのような場合の別の例。

main.c
sub.c
161_ポインタの基礎.c
陰.c

をコンパイルしてmain.exeを出力したいなら、
駄目文字が含まれる"161_ポインタの基礎.c"と"陰.c"について("161_ポインタの基礎.c"は上述の通り)

/* aliaskage.c */
#include "陰.c"

というファイルを本当のファイルを作るのと一緒のタイミングで作っておき、
ビルド時には本当のファイル名でなく、

bcc32 main.c sub.c alias161.c aliaskage.c

と別名ファイル名を指定すればmain.exeを作ることができる。
別名の方は一度作っておけば後々編集することもない。
難点は別名ファイル分だけファイル数が増えることか。

投稿日時 - 2011-08-11 18:31:13

お礼

vaguechatさん
度々の御回答、ありがとうございます。

御提案下さったこの方法を参考にすると問題が解決できました。
以下にその方法をメモしておきます。

まず、以下のようなバッチスクリプトを作成し、gccではコンパイルできたのに、bcc32ではコンパイルエラーが発生したソースファイルの一覧を、Uncompiled_C_files.cpp というファイルに書き出しました。
----------------------------------------------
@echo off
for /f "delims=" %%a in ('dir /b *.c') do (
bcc32 -w- %%a || ( echo #include "%%a" >> Uncompiled_C_files.cpp )
sort Uncompiled_C_files.cpp > temp.dat
uniq temp.dat > Uncompiled_C_files.cpp
del /f temp.dat
)
------------------------------------------------

僕の環境では、Uncompiled_C_files.cppの内容は、以下の様になっていました。
---------------------------------------------------
#include "048_forループを使った素数判定プログラム.c"
#include "049_入力された自然数の約数を全て表示するプログラム.c"
#include "051_インクリメント演算子.c"
#include "059_関係演算子と論理演算子.c"
#include "098_do-whileとif-else-ifを使った単位の変換プログラム.c"
#include "101_ANSI-C標準で定義されているデータ型.c"
#include "109_pow関数による累乗計算.c"
#include "124_型キャストの使用例.c"
#include "133_1次元配列を用いたバブルソート.c"
#include "134_1次元配列を用いたuniqアルゴリズム.c"
#include "152_1次元配列要素の最頻値を求める.c"
#include "161_ポインタの基礎.c"
#include "162_ポインタ演算の基礎.c"
#include "163_1次元double型配列を指すポインタ.c"
#include "168_1次元文字配列を指すポインタ.c"
#include "171_ポインタを使って文字列を後ろから表示する.c"
#include "176_2次元の文字型ポインタ配列.c"
#include "201_関数における引数の参照渡しの例1.c"
#include "202-a_関数における引数の参照渡しの例2.c"
#include "207_コマンドライン引数の基礎.c"
------------------------------------------------------

その後、以下のようなバッチスクリプトを作成しました。
-----------------------------------------------------
@echo off
for /f "delims=" %%a in ('type Uncompiled_C_files.cpp') do (
for /f "usebackq delims=" %%b in (`echo %%a ^| perl -p -e s/#include.\"(.*)_.*\.c\"/\1.CPP/g`) do ( echo %%a > %%b )
)
------------------------------------------------------
このスクリプトを実行すると、例えば、
#include "161_ポインタの基礎.c" という1行だけが記述されている、161.CPPといったファイルができました。
そしてこれらのCPPファイルをbcc32でコンパイルすると、上手く行きました。

今回の問題は小さな事でしたが、それを解決する事で、色々な知識が身に付きました。

vaguechatさん、僕のつまらない質問に御丁寧に答えて下さり、本当にありがとうございました。

投稿日時 - 2011-08-11 22:24:55

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(6)

ANo.6

No1です。

全然問題ないですね。何が違うんだろう?微妙にバージョンが違うんですかね。
念のため、WindowsXPとWindows7(64)と両方でやってみましたが、同じです。

C:\temp>bcc32 161_ポインタの基礎.c
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
161_ポインタの基礎.c:
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland


2000/08/25 05:01 845,824 bcc32.exe


バグかどうかですが、おそらく、プログラムソース中に日本語が使えることを指して日本語化と言っていると思うので、ファイル名の日本語への対応は、バグ対応でなく、機能追加要望として受け止められると思います。

投稿日時 - 2011-08-11 20:54:14

お礼

情報提供あがとうございます。

notnotさんのbcc32ではきちんとコンパイルできたのですね。
バージョンが同じにも関わらず、ぼくのbcc32では上手く行かなかったのは不思議ですね。
まあ気にせずにプログラミングを続ることにします。
ありがとうございました。

投稿日時 - 2011-08-11 22:40:16

ANo.5

Borland社からBorland C++ Compilerなどを開発してる部門は
Embarcadero Technologies社に売却されているのでバグレポートをするならこちらになります。

またEmbarcadero Technologies社は、Borland C++ Compiler 5.5(無償版)については
保証およびサポートを一切しないとしてるみたいですので、
よほどのバグで気が向かない限りは対応はされない気がします。

投稿日時 - 2011-08-11 18:50:36

お礼

情報提供ありがとうございます。
やはり無料ソフトであるので、サポートはしてくれないんですね。
それなら、今回の様に、人と情報交換しながら、自分達で問題解決して行くしかないですね。

投稿日時 - 2011-08-11 22:27:04

ANo.3

いろいろ試してみた結果、
5.5.1版のbcc32はソースファイル名がアルファベットの大文字(0x41-0x5a)の場合、
それをコンパイラ内部では小文字(0x61-0x7a)に変換して処理している様子。
例えば、A.cというファイル名は、

> bcc32 A.c
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
a.c:
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland

のようにa.cとして扱われ、生成されるファイルもa.exeのように小文字になる。

シフトJISの場合、2バイト目が0x41-0x5aの範囲にあるものがファイル名に使われている場合、
0x61-0x7aの範囲にコンパイラ内部では変換されてそれを開こうとする。
Windowsにおいてはファイル名の大文字小文字の違いは同じファイルの名前として扱われるが、
これが2バイト文字においては全く無関係の文字になるので問題として現れる。
A.c→a.cの場合は、bcc32がa.cを開こうとしてもA.cを開くことができるので問題が起きない。

「イ」(0x8343)→「ツ」(0x8363)

例えば、「陰.c」(0x8941)なら「餌.c」(0x8961)として扱おうとする。

この処理はbcc32のバグ仕様だと思う。
例えば、コマンドプロンプト上でgccを使ってNTFS上の「161_ポインタの基礎.c」はきちんとコンパイルできるし、
Xターミナルエミュレータを使ってbash上でbcc32を使っても小文字扱いするという現象はやはり起きる。
つまり端末やシェルの問題でなくbcc32自身の問題と思われる。

対処法は、5.5.1版のbcc32が修正される可能性はまずないと思われるので、
もっと新しいBCCでこれが直っているかどうかを確認してみるとか、
2バイト文字の2バイト目がA-Zであるようなファイル名は使わないようにするか(対象が多すぎるが)、
これが最も現実的だろうけど1バイト文字だけをファイル名に使うか、
どちらにせよ「161_ポインタの基礎.c」をそのまま5.5.1版bcc32でコンパイルするのは無理だと思う。

他には、bcc32に渡す前に別名に変換してbcc32に渡して生成物のファイル名を元に戻すようなユーティリティを作るとか、
bcc32は止めて他のコンパイラに乗り換えるとか……

投稿日時 - 2011-08-11 03:54:01

補足

このバグを、Borland C++ Compilerの作成者達に報告したいのですが、Borlandはアメリカの大企業なので、僕みたいな一般人のバグレポートなんかまず相手にしないと思います。
そこで、Borland C++ Compilerのバグを取り除いている日本人の集団があるのではないかと思い、
Borland C++ Compiler バグ レポート
といった検索語でGoogle検索したのですが、それらしいものが見つかりませんでした。
Borland C++ Compilerのバグがどうやって取り除かれているのかを御存じの方がいらっしゃれば、教えていただきたいです。

投稿日時 - 2011-08-11 17:31:12

お礼

非常に詳しい御説明、ありがとうございます。
わざわざ試行錯誤して下さったのですね。本当に感謝します。

>ソースファイル名がアルファベットの大文字(0x41-0x5a)の場合、それをコンパイラ内部では小文字(0x61-0x7a)に変換して処理している様子。

それは気がつかなかったです。

>例えば、コマンドプロンプト上でgccを使ってNTFS上の「161_ポインタの基礎.c」はきちんとコンパイルできるし、
Xターミナルエミュレータを使ってbash上でbcc32を使っても小文字扱いするという現象はやはり起きる。つまり端末やシェルの問題でなくbcc32自身の問題と思われる。

これは僕も試してコンパイルできたので、bcc32の問題なんだなと思っていました。

>対処法は、5.5.1版のbcc32が修正される可能性はまずないと思われるので、もっと新しいBCCでこれが直っているかどうかを確認してみるとか・・・

bcc32の新しいバージョンを探してみたのですが、5.5.1より新しいものが見つかりませんでした。
もし見つかったら、報告して下さると大変助かります。

>他には、bcc32に渡す前に別名に変換してbcc32に渡して生成物のファイル名を元に戻すようなユーティリティを作るとか、

bcc32に、ソースファイルのみを渡す場合、つまりビルドのみなら、
-----------------------------------------------
@echo off
move /y %1 temp.cpp
bcc32 temp.cpp %*
move /y temp.exe %~dpn1.exe
------------------------------------------------
といったバッチスクリプトで処理すればよいのですが、bcc32への引数は、場合によって変化するので、全ての場合に対応するスクリプトは作成する事ができないと思いました。

この回答をベストアンサーに選ばして頂きたいのですが、そうすると質問を締め切ってしまうので、もう少し延ばさせて下さい。

他に僕と同じような経験をしていて、何かしらの解決策が見つかった型がいらっしゃれば、是非教えていただきたいです。

投稿日時 - 2011-08-11 16:32:47

ANo.2

どうしても日本語を使わねばならない、という切迫した事情がないのであれば、
ソースファイル名には日本語(というか2バイト文字)は使わない方が
無難だと思います。

投稿日時 - 2011-08-10 22:40:11

お礼

御回答ありがとうございます。
ソースファイルに日本語のファイル名を付けて管理しておくと、そのファイルに何が書かれているのかが分かりやすいので、日本語ファイル名を付けているんです。
ですので、どうしてもというわけではないのですが、日本語ファイル名を使いたいんです。

投稿日時 - 2011-08-11 15:56:56

ANo.1

日本語ファイル名に対応してないのかと思いましたが、やってみると出来ますね。

もしかすると、NTFSファイルシステムでなく、FATファイルシステムを使っているとか?それだとファイル名の英大文字小文字の区別がないので、無理だと思います。

投稿日時 - 2011-08-10 21:05:43

お礼

御回答ありがとうございます。
ファイルシステムはNTFSなので、それが問題ではないと思います。

投稿日時 - 2011-08-11 15:55:07

あなたにオススメの質問