問題タブ [surrogate-pairs]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - 128 ~ 255 バイトを同等の UTF16-LE サロゲート ペアにマップする方法
私はこれを達成しようとしています:
ファイルを再構築するためにこれを行う.NETクライアントにbase64文字列として送信する必要があるJava WebサービスにPDFバイト[]があります。
クライアント コードを変更することはできません。現在、Java Web サービスは別の .NET Web サービスを呼び出しており、これにより byte[] が base64 文字列に変換されます。
さまざまな方法 (org.apache.commons.codec.binary.Base64 など) で作成できる base64 に加えて、元の byte[] を UTF-16LE byte[] に変換する必要があります...
私はこれを試しました:
これは、128 未満の値 (例: 1 => 0100、2 => 0200、...、127 => 7F00) では正常に機能しますが、128 -> 255 を超える値では、同等の 2 バイトを取得する方法がわかりません。値; バイト 156 (9C) の対応する値は 8301 (0x5301) であり、バイト 224 (E0) の対応する値は 12501 (0x7D01) であることはわかっていますが、他のすべての値を取得するアルゴリズムを見つけることができませんでした。
バイト値と対応する UTF-16LE サロゲート ペアの間のマッピング テーブル、または値を 128 から 255 にマッピングするアルゴリズムはありますか?
前もって感謝します!
c# - F#の代理Unicode文字に関する問題
代理ユニコード文字(非BMP、1文字あたり4バイト)を含む可能性のある文字列を使用しています。
「\Uxxxxxxxxv」形式を使用してF#で代理文字を指定すると、一部の文字ではC#の場合とは異なる結果が得られます。例えば:
C#:
与える:Length: 2, is surrogate: True
F#:
与える:Length: 2, is surrogate: false
注:一部の代理文字はF#( "\ U0010011"、 "\ U00100011")で機能しますが、一部は機能しません。
Q:これはF#のバグですか?F#を使用した文字列で許可されたサロゲートUnicode文字を処理するにはどうすればよいですか(F#の形式は異なりますか、それとも使用する方法のみです Char.ConvertFromUtf32 0x1D11E
)
更新:
s.ToCharArray()
F#を提供し[| 0xD800; 0xDF41 |]
ます; C#の場合{ 0xD834, 0xDD1E }
cocoa - NSString (BMP の外側) の最初の Unicode コードポイントを抽出する最も簡単な方法は?
歴史的な理由から、Cocoa の Unicode 実装は 16 ビットです0xFFFF
。「サロゲート ペア」を介して上記の Unicode 文字を処理します。これは、次のコードが機能しないことを意味します。
さて、このコードは常に 100% 機能しますが、途方もなく冗長です。
そして、このコードを使用するmbtowc
と機能しますが、それでもかなり冗長で、グローバル状態に影響し、スレッドセーフではなく、おそらく自動解放プールがいっぱいになります。
NSString から最初 (または N 番目) の Unicode コードポイントを抽出するための単純なCocoa/Foundation イディオムはありますか? できれば、コードポイントを返すだけのワンライナーですか?
このCocoa Unicode サポートの優れた要約(記事の終わり近く) で与えられた答えは、単に「試してはいけません。入力にサロゲート ペアが含まれている場合は、それらを処理する適切な方法がないため、それらを除外するか何かを行う必要があります。ちゃんと。"
java - Javaで代理文字を削除するには?
MySql 5.1 に保存しているテキストにサロゲート文字が含まれる状況に直面しています。これでは UTF-16 がサポートされていないため、データベースに保存する前に、これらのサロゲート ペアを Java メソッドで手動で削除したいと考えています。
私は今のところ次の方法を書いていますが、これを処理するための直接的で最適な方法があるかどうか知りたいです.
よろしくお願いします。
python - Python:サロゲートペアが含まれている場合に正しい文字列長を取得する
IPython での次の交換を検討してください。
正しい出力は であるはずですが7
、これらの 7 つの漢字の 5 番目は Unicode コードポイントが高いため、単なる 1 つのコードポイントではなく、「サロゲート ペア」によって UTF-8 で表され、結果として Python 1文字ではなく2文字だと思います。
unicodedata
サロゲート ペアを単一のコードポイント () として正しく返すを使用しても、間違った長さ\U00026177
に渡された場合len()
でも返されます。
Python を UTF-32 用に再コンパイルするような抜本的な手順を踏まずに、このような状況で正しい長さを取得する簡単な方法はありますか?
私は IPython 0.13、Python 2.7.2、Mac OS 10.8.2 を使用しています。
c# - MSWord文書からのSurrogatePairsの取得
Microsoft Word文書を開き、内部のすべてのテキストを読み取り、そのデータを外部システムに送信して処理するアプリケーションを作成しました。これは以前は問題なく機能していましたが、Unicodeを受け入れるようになったため、Wordドキュメントの読み取りで問題が発生しました。
私たちが目にしている問題は、(サロゲートペア)やā(書記素クラスター)など、複数のコードユニットを占める文字を表示できないことです。を表示しようとすると、2つの??が得られ、ā̈を使用すると、書記素を構成する個々の文字が得られます。
これらの文字がこのように返されるのは、ファイルを正しく読み取っていないためだと感じています。しかし、私は探していて、まだ解決策を見つけていません。
次の1つの値のみを含むWordドキュメントを作成しました。
コードで最初に行うことは、ファイルをバイト配列に読み込むことです。
バイト配列をさらに調査すると、次の値が含まれています。
16進値を調べて、0x3fが?に関連していることを知りました。これは、2つの??を取得する理由を説明しています。
次に、データを文字列に変換しようとすると、2つが返されますか?
問題はドキュメントの読み方にあると思いますが、100%確信はありません。誰かが私を正しい道に導くことができますか?
java - 2 つのコード単位を持つ文字で使用される Java charAt
コアJavaから、vol。1、第9版、p。69:
文字 ℤ には、UTF-16 エンコーディングで 2 つのコード単位が必要です。通話中
はスペースを返しませんが、ℤ の 2 番目のコード単位を返します。
しかし、それはスペースを返すようsentence.charAt(1)
です。たとえばif
、次のコードのステートメントは に評価されtrue
ます。
なんで?
関連する場合は、Ubuntu 12.10 で JDK SE 1.7.0_09 を使用しています。
c# - 内部にサロゲート ペアを含む文字列を作成するにはどうすればよいですか?
Jon Skeet のブログで、文字列の反転について語っているこの投稿を見ました。彼が自分で示した例を試してみたかったのですが、うまくいくようです...実際に文字列の反転を失敗させるサロゲートペアを含む文字列を作成する方法がわからない. 自分で失敗を確認できるように、サロゲート ペアを含む文字列を実際に作成するにはどうすればよいでしょうか。
ios - IOS の Unicode サロゲート ペア?
以下の例のサロゲート ペアがあります。
\ud83d\ude04
「1F604」のような対応する値の値を取得する方法を知りたい
サンプルコードはありますか?
任意の助けはかなりありますか?
java - CharSequence のインスタンスが Unicode スカラー値のシーケンスであるかどうかを確認する方法は?
のインスタンスがありますjava.lang.CharSequence
。このインスタンスがUnicode スカラー値のシーケンスであるかどうか (つまり、インスタンスが UTF-16 エンコード形式であるかどうか) を判断する必要があります。の保証にもかかわらず、java.lang.String
Java 文字列は必ずしも UTF-16 エンコーディング形式であるとは限りません (少なくとも最新のUnicode 仕様、現在は 6.2によるとは限りません) 。(ただし、Java 文字列はUnicode 16 ビット文字列です。)
これには、次のようないくつかの明白な方法があります。
- シーケンスのコード ポイントを反復処理し、それぞれを Unicode スカラー値として明示的に検証します。
- 正規表現を使用して、孤立したサロゲート コード ポイントを検索します。
- エンコード エラーを報告する文字セット エンコーダーを介して文字シーケンスをパイプ処理します。
ただし、このようなものはライブラリ関数として既に存在するはずです。標準APIで見つけることができません。私はそれを見逃していますか、それとも実装する必要がありますか?