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

回答編集履歴

3

誤字の修正

2017/09/06 18:30

投稿

退会済みユーザー
answer CHANGED
@@ -3,7 +3,7 @@
3
3
  端的に言えば、
4
4
 
5
5
  Unicodeの第1面のはじめのコードポイントからpythonが扱える最大のコードポイントまでを、
6
- 第0面の代替文字U+FFFDのコードポイントにすべてマッピングしたdict
6
+ 第0面の代替文字`U+FFFD`のコードポイントにすべてマッピングしたdict
7
7
 
8
8
  です。
9
9
 
@@ -17,22 +17,22 @@
17
17
  日常的に使う文字のうち大部分は第0面(BMPとも呼ばれる)に存在しますが、
18
18
  絵文字はUnicodeでは一部、第1面以降に属します。
19
19
 
20
- ところで、質問文中のエラーメッセージには`USC-2`というエンコーディング方式[^1]がでてきますが、UCS-2はBMPしか扱えません。
20
+ ところで、質問文中のエラーメッセージには`UCS-2`というエンコーディング方式[^1]がでてきますが、`UCS-2`はBMPしか扱えません。
21
- つまり、今回のエラーは、第1面以降に属するUnicodeを、第0面しか扱えないUCS-2で処理しようとしたから発生したと考えられます。
21
+ つまり、今回のエラーは、第1面以降に属するUnicodeを、第0面しか扱えない`UCS-2`で処理しようとしたから発生したと考えられます。
22
22
 
23
23
  ### 2. 解決策
24
24
 
25
25
  このエラーを解消するにはどうしたらよいでしょうか?
26
26
 
27
- [提示されたリンク先](https://stackoverflow.com/questions/32442608/ucs-2-codec-cant-encode-characters-in-position-1050-1050)の回答者であるMartijn Pietersさんは、
27
+ [提示されたリンク先](https://stackoverflow.com/questions/32442608/`UCS-2`-codec-cant-encode-characters-in-position-1050-1050)の回答者であるMartijn Pietersさんは、
28
28
  エラー元の文字列(Unicode)に対して第一面以降に属するUnicodeを、
29
29
  第0面に属する適当なUnicode(今回は代替文字である`U+FFFD`を使った)に置換することで解決しようとしました。
30
30
  Pythonで扱える以上のUnicodeは変換対象とする意味はないので、変換範囲は第1面の最初のUnicodeのコードポイントから
31
- Pythonで扱える最大のUnicodeのコードポイント(`sys,maxunicode`で得られる)に限定しています。
31
+ Pythonで扱える最大のUnicodeのコードポイント(`sys.maxunicode`で得られる)に限定しています。
32
32
 
33
33
  またこうした変換を実際に行うため、Martijn Pietersさんはコードポイント[^2]を文字列置換に利用する`translate`関数を使っています。
34
34
  この関数は `{'変換対象のUnicodeのコードポイント':'変換先のUnicodeのコードポイント'}`となる`dict`を引数に渡して使用するもので、
35
- 例えば、第1面に属するU+1F44Dを代替文字U+FFFDに変換するには、
35
+ 例えば、第1面に属する`U+1F44D`を代替文字`U+FFFD`に変換するには、
36
36
 
37
37
  ```
38
38
 
@@ -55,11 +55,11 @@
55
55
 
56
56
  以上から、`non_bmp_map`は、上述した問題を解消するために用意された
57
57
 
58
- UCS-2が扱えないUnicode(すなわちBMP以外のUnicode)のコードポイントを
58
+ `UCS-2`が扱えないUnicode(すなわちBMP以外のUnicode)のコードポイントを
59
- UCS-2でも扱えるUnicode(今回は代替文字U+FFFD)のコードポイントに置き換えるための`dict`
59
+ `UCS-2`でも扱えるUnicode(今回は代替文字`U+FFFD`)のコードポイントに置き換えるための`dict`
60
60
 
61
61
  であるということがわかります。
62
62
 
63
63
 
64
- [^1]: UCS-2は符号化文字集合の一種としての定義もありますが、符号化方式の名称としても用いられるようです。
64
+ [^1]: `UCS-2`は符号化文字集合の一種としての定義もありますが、符号化方式の名称としても用いられるようです。
65
65
  [^2]: コードポイントとはUnicodeひとつひとつに振られている番号のことです。

2

誤記の訂正

2017/09/06 18:30

投稿

退会済みユーザー
answer CHANGED
@@ -1,31 +1,3 @@
1
- 1. 問題の所在
2
-
3
- `print()`は何をする関数なのか?
4
- => 与えられた文字列を、適切な形にエンコードしてターミナルに書き込む/stdoutに書き込む
5
-
6
- `print()`で`UnicodeEncodeError`が発生したということは、書き込む直前に失敗したということ
7
-
8
- なぜ失敗したかというと、与えられた文字列の中にUCS-2で扱える文字集合の範囲を超えるUnicodeが入っていたから。
9
- つまりUCS-2はUnicodeの中でも、BMPと呼ばれる第0面(plain)しか扱えず、与えられた文字列の中には第1面以降に存在するUnicode
10
- が入っていたため、エンコードできなかったと考えられる。
11
-
12
- では、どうすればよいか。
13
-
14
- Stackoverflowでの回答者は、第一面以降のUnicodeを第0面に存在する代用文字で置き換えることによって
15
- この問題を回避している。
16
-
17
-
18
-
19
-
20
-
21
- 修正がやや不十分です。
22
- 質問文からだけでは前半のコード例とprint関数との関係を読み取ることができません。
23
-
24
-
25
-
26
-
27
-
28
-
29
1
  > ただdict型non_bmp_mapが何者なのかいまいちわかっていないので、もし出来れば教えていただきたいです。m(_ _)m
30
2
 
31
3
  端的に言えば、

1

誤記の訂正

2017/09/04 07:32

投稿

退会済みユーザー
answer CHANGED
@@ -1,3 +1,31 @@
1
+ 1. 問題の所在
2
+
3
+ `print()`は何をする関数なのか?
4
+ => 与えられた文字列を、適切な形にエンコードしてターミナルに書き込む/stdoutに書き込む
5
+
6
+ `print()`で`UnicodeEncodeError`が発生したということは、書き込む直前に失敗したということ
7
+
8
+ なぜ失敗したかというと、与えられた文字列の中にUCS-2で扱える文字集合の範囲を超えるUnicodeが入っていたから。
9
+ つまりUCS-2はUnicodeの中でも、BMPと呼ばれる第0面(plain)しか扱えず、与えられた文字列の中には第1面以降に存在するUnicode
10
+ が入っていたため、エンコードできなかったと考えられる。
11
+
12
+ では、どうすればよいか。
13
+
14
+ Stackoverflowでの回答者は、第一面以降のUnicodeを第0面に存在する代用文字で置き換えることによって
15
+ この問題を回避している。
16
+
17
+
18
+
19
+
20
+
21
+ 修正がやや不十分です。
22
+ 質問文からだけでは前半のコード例とprint関数との関係を読み取ることができません。
23
+
24
+
25
+
26
+
27
+
28
+
1
29
  > ただdict型non_bmp_mapが何者なのかいまいちわかっていないので、もし出来れば教えていただきたいです。m(_ _)m
2
30
 
3
31
  端的に言えば、
@@ -17,7 +45,7 @@
17
45
  日常的に使う文字のうち大部分は第0面(BMPとも呼ばれる)に存在しますが、
18
46
  絵文字はUnicodeでは一部、第1面以降に属します。
19
47
 
20
- ところで、Unicode表し方としてUCS-2とUCS-4とありますが、UCS-2はBMPしか扱えません。
48
+ ところで、質問文中エラーメッセージに`USC-2`いうエンコーディング方式[^1]でてきますが、UCS-2はBMPしか扱えません。
21
49
  つまり、今回のエラーは、第1面以降に属するUnicodeを、第0面しか扱えないUCS-2で処理しようとしたから発生したと考えられます。
22
50
 
23
51
  ### 2. 解決策
@@ -30,7 +58,7 @@
30
58
  Pythonで扱える以上のUnicodeは変換対象とする意味はないので、変換範囲は第1面の最初のUnicodeのコードポイントから
31
59
  Pythonで扱える最大のUnicodeのコードポイント(`sys,maxunicode`で得られる)に限定しています。
32
60
 
33
- またこうした変換を実際に行うため、Martijn Pietersさんはコードポイント[^1]を文字列置換に利用する`translate`関数を使っています。
61
+ またこうした変換を実際に行うため、Martijn Pietersさんはコードポイント[^2]を文字列置換に利用する`translate`関数を使っています。
34
62
  この関数は `{'変換対象のUnicodeのコードポイント':'変換先のUnicodeのコードポイント'}`となる`dict`を引数に渡して使用するもので、
35
63
  例えば、第1面に属するU+1F44Dを代替文字U+FFFDに変換するには、
36
64
 
@@ -61,4 +89,5 @@
61
89
  であるということがわかります。
62
90
 
63
91
 
92
+ [^1]: UCS-2は符号化文字集合の一種としての定義もありますが、符号化方式の名称としても用いられるようです。
64
- [^1]: コードポイントとはUnicodeひとつひとつに振られている番号のことです。
93
+ [^2]: コードポイントとはUnicodeひとつひとつに振られている番号のことです。