• ベストアンサー

文字コード

unixで記述したファイル(恐らくはEUCコードと思われます)はDOS環境や、場合によってはunix上のviやlessなどでも、 ^M が行末に表示されてしまいうっとうしいことがあります。 1)この制御コードは一体何なのですか? 2)どのような場合、この制御コードが挿入されますか?あるいは、どのような場合、このコードが表示されるのですか? 3)"^M"が表示されてしまっている場合、どのようにすれば表示がされなくなるのでしょうか? (その場しのぎ的ではあるが、nkf -s などとしてSJISに変換させれば、dos系のvi や lessではまともに表示されます。他の方法を教えてください...例えば、vi や lessを文字コードを指定して起動するなど...) #そのほか、文字コード関連でツボが有りましたら教えてください。

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

  • ベストアンサー
  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.3

> 1)この制御コードは一体何なのですか? 文字コードの話とは直接関係ありません。OSによって、「改行」を表すコードが違うことがこの現象を引き起こします。 いわゆるDOS系では、改行は 0x0d+0x0a の2バイトで表されます。 unix系では、改行は 0x0a の1バイトで表されます。 > 2)どのような場合、この制御コードが挿入されますか?あるいは、どのような場合、このコードが表示されるのですか? この制御コードは挿入されるのではなくて、元々「ある」ものです。 unixの流儀で書かれたプログラムが DOS 起源のテキストファイル(*)をそのまま読もうとすると 0x0d が余ります。 それが ^M です。   (*) 例えば、DOS から ftp のバイナリモードでテキストファイルを持ち上げたりするとこういうことになる > 3)"^M"が表示されてしまっている場合、どのようにすれば表示がされなくなるのでしょうか? 確かにうっとおしいので、有名どころでは対処されています。 今、確認してみたのですが、私が使っている less version 332+iso224 や vim の JVim 3.0-j2.0a なんかでは 先のケースで挙げたようなファイルでも ^M は表示されません。 因みに OS に付属してくる vi では ^M が表示されます。 # というか、^M が表示される方が普通なんですけどね

その他の回答 (4)

  • ide1
  • ベストアンサー率77% (7/9)
回答No.5

> #そのほか、文字コード関連でツボが有りましたら教えてください。 ご質問とは関連無いかもしれませんが...。 WindowsマシンからUXIXマシンにFTPソフトでファイルコピー を行い、さらにそのコピーのとき、「アスキーモード」を指定 しますと、改行コードが変換され、^Mをとってくれます。 なお、FTPソフトはSJISからEUCへの変換もしてくれます。(指定が必要です。) ※FTPソフトは、あるマシンから別のマシンにファイルを コピーするときに使います。(Windowsのエキスプローラ で行うファイルコピーと同じようなことをFTPという仕組み で行います。) 私の経験で^Mが付くときは ・FTPソフトでアスキーモードの指定をしていない ・FTPソフトでアスキー/バイナリ自動判別モードにして いるが、サフィックスがFTPソフトに登録されていないため、 バイナリでコピーされてします。(例えば .c というサフ ィックスが登録されていないなど。) です。 いろいろ原因はありえると思いますが。

参考URL:
http://www.vector.co.jp/soft/win95/net/se061839.html
  • ranx
  • ベストアンサー率24% (357/1463)
回答No.4

横レスです。 y2000さんのやり方で、 :%s/^M// では^Mを入力した時点でコマンドが解釈されてしまうので :%s/^V^M// と入力しましょう。 (言うまでもないと思いますが、^V, ^M はそれぞれ  Ctrl+V, Ctrl+M です。)

  • y2000
  • ベストアンサー率44% (4/9)
回答No.2

y2000です。 すみません。 記述に誤りがありました。 3) 他の方法としては viで :%s/^M// と入力すると削除できるようです。 です。

  • y2000
  • ベストアンサー率44% (4/9)
回答No.1

1)、2) windowsなどで書かれた英数字のみのテキスト文章をLinuxで読むと改行ごとに^Mが残ってしまうようです。 3) 他の方法としては viで :%2/^M// と入力すると削除できるようです。

関連するQ&A

  • UNIX上で文字コードの一括変換はできますか?

    UNIX上で、文字コードを変換したいのですが、今まではSJISからEUCといった変換にnkfを使用してきましたが、nkfだと1ファイル毎でしか文字コードを変換できませんでした。1行のコマンドでそのディレクトリ内の全てのファイルの文字コードを変換してくれるコマンドはありますでしょうか? UNIX上で実現できれば、Perlでもなんでも結構です。よろしくお願いします。

  • 文字コードの変換方法

    お世話になります。 サーバ上で生成した、文字コードがEUCのテキストファイルをSJISに文字コードを変換したいのですが、nkfコマンドが使用できません。 nkfコマンドを使用せず、EUC⇒SJISへ文字コードを変換する方法をご教示頂けますでしょうか。 また文字コードを変更すれば改行コードの変更はしなくてもいいのでしょうか。 宜しくお願い致します。

  • Solarisの文字コードについて

    Solaris8をインストールしました。 文字コードはEUCになっていると思いますが、テキストファイルを EUCでSolaris8サーバにアップロードしてもviで参照すると文字化けしてしまいます。 (1)システムの文字コードの確認方法を教えて下さい。 (2)文字コードをSJISからEUCに変換する方法を教えて下さい。 (nkfコマンドを打ってもcommand not foundになります。。標準ではインストールされないのでしょうか?) p.s OSのインストール時、下記のように入力しました。 ・Select a Locale →0.Japanese EUC(ja) ・ソフトウェアの対応地域 →アジア・Japanese EUC(ja)、Japanese PC Kanji(ja_JP.PCK)、Japanese UTF-8(ja_JP.UTF-8)

  • DOS-->UNIXで制御文字?(^M)が付加されてしまう問題

    DOS(Windows)で記述したファイルをUNIX(Solaris)へ持ってゆき閲覧すると以下の様に "^M"が行末に挿入されてしまっています。 ------- class TS_opCond { ^M integer sync_hi_1_from;^M integer sync_hi_1_to;^M integer sync_hi_2_from;^M integer sync_hi_2_to;^M integer sync_hi_3_from;^M integer sync_hi_3_to;^M ^M } ------- 現在これが原因でコンパイルが通らないのですが、 1) まず、この文字"^M"は、/bin/vi では見ることが出来ますが、less, emacs, jvim 等では画面で見ることは有りません。less, emacs, jvim でこれを表示させるにはどの様にしたら良いでしょうか? 2) この文字は何ですか?若しくはどういう理由で表示される|されないのでしょうか? 3) DOS(windows)で作成したtxtをUNIXへ持っていった時にこの問題をなくすためにはどのようにしたら宜しいのでしょうか?? ※emacs でファイルを表示させると"DOS"と認識しています。 ※ファイルの生成は詳細には、オリジナルはUNIX上で作成し、eucでセーブされています。それをwindowsへ持ってゆきmeadowで編集しました。meadow上では特にコーディングに関する問いかけが有りませんでした。 以上、宜しくお願いいたします。

  • Ruby 文字コード判別

    NKF.guessで文字コードを判別し、そのコードがWindows-31J以外だったら エラーが出るようにしたいです Shift-JISの場合だと if(NKF.guess(str) == NKF::SJIS) この様に記述をして判別させています SJISの部分をCP932に変えて試してみましたが駄目でした 宜しくお願いします

    • ベストアンサー
    • Ruby
  • 文字コードについて

    仕事場のワークステーションがUNIX→Linuxに移行することが決まりました。 そこで現在使用しているUNIXのプログラムをLinuxにコピーしたのですが、文字コードがおかしいのか文字化けして動作しません。 動作としては プログラムを立ち上げる    ↓ 環境設定ファイルを読み込む    ↓ 上手く起動する 正常なら上記の動作ですが、環境設定ファイルが読み込めず停止してしまいます。 そこで環境設定ファイルを開くと文字化けしてました。 その後、今までのUNIX上での環境設定ファイルをlessで表示させ、 新たなLinuxマシンにviでコピー・ぺ-ストして保存したところ 正常に動作しました。 操作は別端末のTeraTaermで行っています。 これはLinuxマシンの文字コードがUTF-8のためEUCが認識できないからでしょうか? 行き詰ってますので、どうかお願いいたします。 Linuxの環境は Red Hat 8.0のエンタープライズ版です。

  • 文字コードの判別について

    とあるテキストファイルがあります。UNIX上で文字コードの判別を行いたいのですが、nkf --guess test.txtと打って調べると、 test.txt: ASCII (CRLF) となります。このファイルは、Shift-JISだという判定だと思います。 ファイルをUTF8に変換したいので、(1)Windows上のエディタ(秀丸)の機能を使ってUTF8に変換してからUNIX上にアップロードしたり、また(2)UNIX上から直接nkf -w --overwrite test.txtを実行して変換したりしたのですが、nkf --guess test.txtを打って調べると相変わらず test.txt: ASCII (CRLF) のままです。 色々調べた結果、ファイルの中身が英数字のみしか書かれていないので、nkfがこのファイルをShift JISだと「推測」しているということがわかってきました。確かに、試しにファイルの中身に日本語を書いて保存して実行してみると、ようやくnkf --guess test.txtの結果が test.txt: UTF-8 (CRLF) と表示されるようになりました。 これらの結果は、ファイルの中身のマルチバイト文字のコードを見て初めて文字コードがわかるようになるというように思えます。 私の理解ではファイル自体にEUCやShift JIS、UTF-8などの文字コードがあるものとばかり思っておりました。つまり、test.txtの内容が"This is a pen."であったとしてEUC、Shift JIS、UTF-8では全く異なる三種類のファイルが存在し得るものだと思っておりました。しかしこれは私の理解が間違っていて、英数字であれば常にShift JISであり、マルチバイト文字があって初めてUTF-8なのかEUCなのかShift JISなのかが決定されるということなのでしょうか? 英数字のみのファイルでもUTF-8ファイルという前提を確認する方法はないのでしょうか? 宜しくお願いします。

  • 文字コードEUCのPerlプログラムが文字化けしてしまいます

    Perlで書かれたCGIを実行しようとしているのですが、プログラムはEUCで記述されているそうです。nkf -g ***とするとEUC-JPとなります。 print " <META http-equiv=\"Content-Type\" content=\"text/html; charset=EUC-JP\">\n"; とも記述されているのですが、ブラウザで実行(閲覧)すると文字化けして、ブラウザのエンコードは、Unicode(UTF-8)になっています。 ちなみに、OSはCentOS5.2です。 どうやったら、EUCで記述されたCGIが文字化けせずに実行できるのでしょうか? teratermでサーバに接続語、viコマンドで表示しても文字化けしています。ファイルの文字コードをEUCからUTF-8にして(nkf -w ***)、ブラウザでアクセスしても文字化けしてしまいます。

    • ベストアンサー
    • Perl
  • 文字コードの変換について

    現在、表示はPHPで文字コードはEUCで表示しています。 そのときには表示できるのですが、 表示したものを、SHIFT-JISにエンコードしてエクセルに表示するときに、文字コードの違いにより表示されないものがあります。 エンコードは $str = mb_convert_encoding($str, "SJIS", "auto"); と行っています。 EUCからSJISに変換するときに、何か特別なことを行う必要があるのでしょうか??

    • ベストアンサー
    • PHP
  • TeraPadの文字コード

    TeraPadの文字コードについて教えてください。 1. TeraPadで扱える文字コードは Shift-JIS、JIS、EUC、Unicode、UTF-8、UTF-8N の6種類あるようですが、このEUCとEUC-JPは 同じものですか? 2. Shift-JISで保存すると、TeraPadの下の部分に 表示される文字コードがSJISとなります。 これはShift-JISのことですか? 3. 短い文章では文字コードを誤認識する場合も あるようですが、どうしたら正しく認識 させられますか? 指定した文字コードで保存できず困っています。