teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

修正

2020/04/05 06:24

投稿

tiitoi
tiitoi

スコア21960

answer CHANGED
@@ -20,4 +20,36 @@
20
20
  json_bin = f.read()
21
21
 
22
22
  print(json_bin)
23
- ```
23
+ ```
24
+
25
+ ## 追記
26
+
27
+ Python 2系と3系で文字列の扱いは大きく異るので、WEb 上の情報を参照する際はどのバージョンの話なのかをご注意ください。
28
+
29
+ [Python2とPython3のstr型/unicode型/bytes型/encode/decodeの違い解説 - Qiita](https://qiita.com/miyagi1024/items/0e8cc40d95bf6236729e)
30
+
31
+ Python 3では文字列は内部的に unicode で管理されている str 型で表されます。
32
+ この str をテキストにする際には、ascii や utf-8 といったエンコード方式でバイナリ化します。
33
+ open() でモードを "w" にしてエンコード方式を指定して書き込むのと、
34
+ str.encode() でバイナリにしてから、モードを "wb" にしてバイナリとして書き込むのは同じ意味です。
35
+
36
+ ```python
37
+ text = "ハローワールド"
38
+
39
+ with open("sample.txt", "w", encoding="utf-8") as f:
40
+ f.write(text)
41
+
42
+ with open("sample2.txt", "wb") as f:
43
+ f.write(text.encode("utf-8"))
44
+ ```
45
+
46
+ > jsonは、文字なのでasciiなので、シンプルにバイナリ(byte型に変換できる)
47
+
48
+ json は ascii 以外の文字 (日本語とか) も含められるので、その場合、"utf-8" とかその文字を含む文字コードを使う必要があります。
49
+ どの文字コードでエンコードするかは利用者が決めることなので、bytes オブジェクトにしたい場合は str.encode() で明示的に変換する必要があります。
50
+
51
+ > バイナリって人間が読めない形式だと思っていましたが、outputは普通に読める形式でしたが。。
52
+
53
+ テキストもバイナリです。
54
+ テキストエディタで開いたときに文字として表示されるのは、テキストエディタが文字コードを判断して、バイナリを解釈しているからです。
55
+ 間違った文字コードで解釈すると、正しく文字として認識できず、文字化けが発生します。