回答編集履歴

1

不備があったため追記

2018/02/17 02:06

投稿

KSwordOfHaste
KSwordOfHaste

スコア18394

test CHANGED
@@ -23,3 +23,37 @@
23
23
 
24
24
 
25
25
  不備ありましたらご容赦を・・・
26
+
27
+
28
+
29
+ ---
30
+
31
+ 追記:申し訳ありません。不備がありました。
32
+
33
+ Python3.6.3 LANG=ja_JP.UTF8でUTF-8のソースコード上にBMP範囲外の文字列リテラルを直接記述して、列挙してみたところ以下のようにサロゲートペアでなく単一の文字として扱われていました。
34
+
35
+
36
+
37
+ len('????') == 1
38
+
39
+ ord('????') == 0x1f40d
40
+
41
+
42
+
43
+ このため最初の回答の関数ではNGで次のようにしなくてはなりませんでした。
44
+
45
+ リスト2
46
+
47
+ ```Python
48
+
49
+ # BMP範囲外のUNICODE文字が1文字として扱われている場合
50
+
51
+ def leaveOnlyBMP(s):
52
+
53
+ return "".join(filter(lambda c: ord(c) < 0x10000, s))
54
+
55
+ ```
56
+
57
+
58
+
59
+ ソースコード上に直接書いたり外部からエンコーディングを指定して文字列を読み込んだ場合など、Python3の環境でサロゲートペアになることがあるのかないのかが自分にはわかってませんが、BMP以外を含めたユニコード全範囲の文字を単一のコードポイントとして扱う能力が今のPythonにはあるようなのでその条件下ではリスト2でないといけないと思いました。