結論
- エンコード形式の変換(utf-16→utf-8)
- 制御文字の^Mを削除
が必要だった。
cat
myname@PC:~/test3$ cat requirements.txt
��❖❖argon2-cffi==20.1.0
asgiref==3.4.1
bcrypt==3.2.0
cffi==1.14.6
(以下略)
※❖のところは、菱形の中に?が入っている文字
cat -Aで調べてみた
myname@PC:~/test3$ cat requirements.txt-A
M-^?M-~a^@r^@g^@o^@n^@2^@-^@c^@f^@f^@i^@=^@=^@2^@0^@.^@1^@.^@0^@^M^@$
^@a^@s^@g^@i^@r^@e^@f^@=^@=^@3^@.^@4^@.^@1^@^M^@$
^@b^@c^@r^@y^@p^@t^@=^@=^@3^@.^@2^@.^@0^@^M^@$
^@c^@f^@f^@i^@=^@=^@1^@.^@1^@4^@.^@6^@^M^@$
(以下略)
ファイル形式を調べる
file <ファイル名>
myname@PC:~/test3$ file requirements.txt
requirements.txt: Little-endian UTF-16 Unicode text, with CRLF line terminators
UTF-16とwith CRLFであることがわかった
変換して表示してみる
iconv -f utf-16 -t utf-8 <ファイル名>
myname@PC:~/test3$ iconv -f utf-16 -t utf-8 requirements.txt
argon2-cffi==20.1.0
asgiref==3.4.1
bcrypt==3.2.0
cffi==1.14.6
(以下略)
変換して保存
cp requirements.txt requirements.txt.utf16
iconv -f utf-16 -t utf-8 requirements.txt.utf16 > requirements.txt.new
ただこれでも罠があった
cat -Aで確認してみると、^Mが残っている。。
myname@PC:~/test3$ cat requirements.txt.new -A
argon2-cffi==20.1.0^M$
asgiref==3.4.1^M$
bcrypt==3.2.0^M$
cffi==1.14.6^M$
(以下略)
山Mを消す方法
結論
sed -i s/^M//g requirements.txt.new
で消えたが^Mの入力に苦戦した。
^Mは制御コードなので、普通に^とMを文字として打ち込んでは^Mと認識されなかった。
次のサイトを見た。
「^M」はキーボードで「^」と「M」を入力するのではなく、「Ctrl-v」と「Ctrl-m」を連続して入力します。
WindowsTerminalで作業していたので「Ctrl-v」は「貼り付け」と認識される。。
普通のwslの方で実施したところ、山Mの入力ができた。
(Linuxだとすべて改行コードLFだと思っていたが、TypeScriptはLinuxでもCRLFらしい。)
関連
git config実施時のcore.autocrlfの設定が関係している模様。