2017-12-19 9 views
1

私はC#からPythonに文字列索引付けの問題をたくさん持っています。基本的に既存のデータパイプライン(C#では)は、Pythonモデルが消費する文字列インデックスを生成します。これらの2つの言語は、それぞれのユニコードシステムで異なるコードポイントを使用しています。http://illegalargumentexception.blogspot.com/2010/04/i18n-comparing-character-encoding-in-c.htmlPython3で異なるコードポイントを使用できますか?

したがって、C#(16ビット、暗黙のutf-16)の文字列の長さとインデックスは100%関連性がありませんPythonで(16または32)。場合によっては、文字が0xFFFF(16ビット以上)より大きい場合、PythonはC#よりも小さな文字列長を生成することがあります。

問題は:文字列のインデックスと長さが同じであることを確認する方法はありますか? C#のように暗黙的に16ビットを使うようにPythonを強制することは可能ですか?

具体例はこれです:

, Ṣur 

そのUTF-8バイト:Pythonで

b'\xf0\x90\xa4\x91\xf0\x90\xa4\x85\xf0\x90\xa4\x93, \xe1\xb9\xa2ur' 

C#は、15インデックスがされるレポートなど、この文字列の長さは、12ここでまた、ある言語から別の言語へ

+0

これはPythonの文字列ではありません。これは生のバイトシーケンスです。 –

+0

utf-8エンコーディングの文字列 "、üur"です。コピー&ペーストすると、文字が再現されないことがあります。私は調査のためにバイトをコピーして貼り付けます。 –

+0

'.decode( 'utf-8')'を呼び出すと、文字列ができます。しかし、あなたが示したことは文字列ではありません。 –

答えて

2

あなたはおそらく、ここでこの答えあたりStringInfoクラスを使用します:Why is the length of this string longer than the number of characters in it?

using System; 
using System.Text; 
using System.Globalization; 

namespace StackOverflow { 
    class Program { 
     public static void Main(string[] args) { 
      var s = ", Ṣur"; 
      // Len == 11 
      Console.WriteLine("{0}: {1}", s, s.Length); 

      // len == 8 
      var si = new StringInfo(s); 
      Console.WriteLine("{0}: {1}", s, si.LengthInTextElements); 
     } 
    } 
} 

または、Pythonの側で、あなたはこれを試すことができますが、それは2-前提としているので、それはC# 'sの長さに非常に同じではありません最初の65,536 UTF-16文字だけをカバーします。

#!/usr/bin/env python3 

s = ", Ṣur" 
# len == 8 (displayable len) 
print("{}: {}".format(s, len(s))) 

# len == 11 (C# wackiness) 
print(int(len(s.encode("utf-16"))/2) - 1) 
+1

ありがとう!これはC#からPythonへの方向性を解決します。 PythonからC#への他の方向への提案はありますか? –

+0

ちょうど好奇心から離れる:発音区別記号を組み合わせると、StringInfoはそれらを別々の文字として数えますか?そうでない場合、これはPythonが文字を数える方法とはやはり違います... – lenz

+0

@YoHsiao - 私はPythonの半相当のUTF-16長さの例を追加しました。 – mattmc3

関連する問題