2016-08-21 12 views
3

小さなプログラムを実現するためにRustプログラミングになっています。文字列変換では少し失われています。私のプログラムでVec <u16>またはVec <WCHAR>を&strに変換する

次のように、私はベクトルを持っている:

let mut name: Vec<winnt::WCHAR> = Vec::new(); 

WCHARは、私のWindowsマシン上u16と同じです。

私はVec<u16>を、データで埋め込むCの関数(ポインタ)に引き渡します。私はその後、ベクトルに含まれる文字列を&strに変換する必要があります。しかし、私が何をしようとしても、私はこの変換を働かせることはできません。

私が働いて得ることができた唯一の事はWideStringに変換することです:

widestr = unsafe { WideCString::from_ptr_str(name.as_ptr()) }; 

しかし、これは間違った方向へのステップであると思われます。

Vec<u16>&strに変換する最善の方法は、ベクトルが有効なヌル終了文字列を保持していることを前提としています。

答えて

8

次に、ベクトルに含まれる文字列を&strに変換する必要があります。しかし、私が何をしようとしても、私はこの変換を働かせることはできません。

これを「フリー」変換にする方法はありません。

&strは、UTF-8でエンコードされたUnicode文字列です。これはバイト指向エンコーディングです。あなたがUTF-16(またはではなく、共通のUCS-2エンコーディングである)を持っていれば、他のものを読む方法はありません。これはJPEG画像をPDFとして読み込むのと同じことです。両方のデータのチャンクは文字列かもしれませんが、エンコーディングは重要です。

最初の質問は「本当にする必要がありますか?」です。多くの場合、ある関数からデータを取り込み、別の関数に戻して、決してそれを見ることはできません。もしそれで逃げることができれば、それは最善の答えかもしれません。

を実行する場合は、に変換する必要があります。発生する可能性のあるエラーに対処する必要があります。 16ビット整数の任意の配列は、が有効なUTF-16またはUCS-2でない可能性があります。これらのエンコーディングは、無効な文字列を簡単に生成する可能性のあるエッジケースを持っています。ヌル終了はもう一つの側面です。実際にはUnicodeは埋め込みNUL文字を許可しているので、ヌル終了文字列はすべてのUnicode文字を保持することはできません!

を入力して、入力ベクトル内のいくつのエントリが文字列を構成しているかを確認したら、入力フォーマットをデコードし、出力フォーマットに再エンコードする必要があります。これはある種の新しい割り当てを必要とする可能性が高いので、Stringで終わる可能性が最も高く、&strのどこでも使用できます。

UTF-16データを文字列に変換する組み込みのメソッドがあります(String::from_utf16)。これらのエラーのケースを考慮して、Resultを返します。String::from_utf16_lossyもあり、無効なエンコードされた部分をUnicodeの置換文字に置き換えます。

u16またはWCHARへのポインタから開始する場合は、最初にslice::from_raw_partsを使用してスライスに変換する必要があります。ヌルで終了する文字列がある場合は、NULを見つけて、入力を適切にスライスする必要があります。


1:これは実際にタイプを使用する優れた方法です。 &strがUTF-8でエンコードされていることが保証されているので、それ以上のチェックは必要ありません。です。同様に、WideCStringは、施工時に一度チェックを実行し、その後の使用でチェックをスキップする可能性があります。

+1

私を助けてくれてありがとう、私は明らかに完全に失われていて、何とか両方のタイプのエンコーディングが同一であると仮定しました。この文脈では、この変換のために別のStringオブジェクト(実際にはオブジェクトを錆びているオブジェクトと呼んでいますか?)を使用するのは意味があります。 – Norbert

+2

@Norbert:物事をオブジェクトにするかどうかについて熟考している人はいないと思います。誰もがその言葉を理解するだけで十分です:) –

+0

@Norbertええ、私はあなたが "オブジェクト"と呼ぶものに依存していると思います。あなたがデータの集まりと関連するメソッドを意味するならば、そうです、それはオブジェクトです。私は通常、単に "クラス"の代わりに "タイプ"と言うだけで、 "タイプのインスタンス"と言うと思います。私は自分自身が "オブジェクト"を頻繁に言う必要があることを発見していない。私は誰もがうまく理解していると思う。 – Shepmaster

関連する問題