問題タブ [codecvt]
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.
c++ - UTF-16 codecvt ファセット
ロケールに関するこの質問から拡張し、この質問で
説明しました: 私が本当にやりたかったのは、UTF-16 ファイルを理解するロケールに codecvt ファセットをインストールすることでした。
自分で書くことができました。しかし、私は UTF の専門家ではないので、ほぼ正しいと確信しています。しかし、それは最も不便な時期に壊れます。それで、C++ から使用できるビルド前の codecvt (またはその他の) ファセットの (Web 上に) リソースがあり、ピア レビューおよびテストされているかどうか疑問に思っていました。
その理由は、ファイルを読み取るときにデフォルトのロケール (私のシステム MAC OS X 10.6) が変換なしで 1 バイトを 1 wchar_t に変換するためです。したがって、UTF-16 でエンコードされたファイルは、多くの null ('\0') 文字を含む wstring に変換されます。
c++ - std :: codecvtファセットを作成するにはどうすればよいですか?
std :: codecvtファセットを作成するにはどうすればよいですか?UTF-16からUTF-8に移行し、UTF-16からシステムの現在のコードページ(Windows、つまりCP_ACP)、およびシステムのOEMコードページ(Windows、つまりCP_OEM)に移行するものを作成したいと思います。
クロスプラットフォームが推奨されますが、Windows上のMSVCでも問題ありません。このクラスを正しく使用する方法について、チュートリアルやその性質のものはありますか?
visual-studio-2010 - ViualStudio 2010 で間違った codecvt が発生する
次のコードは、コンソールに「失敗」を出力します。
ソースを調べたところ、関数_Mbrtowc (wmbtowc.c) が -1 を返すため、関数 in() が失敗することがわかりました。
___mb_cur_max_l_func() ( initctyp.c) は、Russian_Russa.1251 ロケールに対して 1 を返すためです。その意味?codecvt が char* を wchar_t* に変換できないのは正常ではないと思います。
c++ - basic_stream を吹き込むとどうなりますかcodecvt_utf16 を使用したロケールファセット?
basic_stream<char>
ロケールにcodecvt_utf16<char>
ファセットを吹き込むとどうなるかは指定されていますか?
基本的に、ライブラリの Unicode ビルドと非 Unicode ビルドのインターフェイスを変更するためにtypedef wchar_t tchar;
andを使用します。ファイルストリームにロケールとファセットtypedef char tchar;
を常に吹き込むことで、ソースをよりシンプルにしたいと考えています。codecvt_utf16<tchar>
これはとにかく機能しますか?
(そのような inbued によって読み取られるファイルが、fstream
ASCII のみ、または現在のグローバル ロケールで表現可能なコード ポイントのみのいずれかを含む必要があるかどうかは気にしません。)
編集:
それcodecvt_utf16<char>
が不特定の動作であるように思われる場合、basic_stream に を吹き込むのはcodecvt_utf16<wchar_t>
どうですか? この動作は指定されていますか?
c++ - Unicode、Boost、C ++、codecvtsで困惑
C ++では、Unicodeを使用して処理を実行したいと思います。それで、Unicodeのうさぎの穴に落ちた後、私はなんとか混乱、頭痛、そして場所の列車の大破に終わった。
しかし、Boostでは、Unicodeファイルパスを使用しようとしたり、Unicode入力でBoostプログラムオプションライブラリを使用しようとしたりするという不幸な問題がありました。ロケール、codecvts、Unicodeエンコーディング、Boostのテーマで見つけたものは何でも読んだことがあります。
物事を機能させるための私の現在の試みは、UTF-8文字列を取得してプラットフォームのエンコーディング(POSIXではUTF-8、WindowsではUTF-16)に変換するcodecvtを用意することですが、これは避けようとしていwchar_t
ます。
私が実際に得た最も近い方法は、Boost.Localeを使用してこれを実行し、出力時にUTF-8文字列からUTF-32文字列に変換しようとすることです。
ワイド文字を使用して他の種類の変換を行っていたと思いますが、実際に何をしているのかわかりません。この時点で、その仕事に適したツールが何であるかはわかりません。ヘルプ?
c++ - Is there a codecvt decoding scenario where the destination buffer needs space for more than one internal character?
When using std::codecvt
's in
method to decode an external byte sequence to an internal char sequence, is there a situation where the destination buffer of internal chars needs space for more than one internal char?
Here is some code for reference:
This is a simplification of some template code that I have written to decode bytes read individually from a Winsock SOCKET
, where the user desires "unbuffered" input. Basically, with each iteration of a loop, a byte is read into the external buffer. The loop terminates when in_res
is not std::codecvt_base::partial
.
What I am wondering is: Is there a scenario where a call to in()
would require space in the destination buffer for more than one internal character? I.e., is there a scenario that would make the above-described loop an infinite loop?
c++ - 新しいcodecvt_bynameの構築が成功したかどうかを確認する方法
新しいものの建設がstd::codecvt_byname
成功したかどうかを確認する標準的な方法はありますか?
私は次のプログラムを試していました。
std::runtime_error
名前付きロケールがサポートされていない場合、Windows上のlibstdc++は明らかにオブジェクトをスローします。ただし、Microsoft VisualC++のSTL実装は例外をスローしません。
どのC++コンパイラがコードをコンパイルするかわからない場合、新しいものの構築がstd::codecvt_byname
成功したかどうかを確認するにはどうすればよいですか?または、メモリ不足のシナリオがないと仮定して、構築が成功するかどうかを確認する方法はありますか?
c++ - codecvtの特殊化:3番目のテンプレート引数がstd::mbstate_tでない場合のリンカーエラー
与えられた
リンカはメッセージで死にます
[vtable for std :: codecvt] + 0x50):'std :: codecvt :: do_max_length()const'への未定義の参照、すべてのcodecvtdo_*メンバーに対して繰り返されます。
[vtable for S] + 0x20):'std :: codecvt :: do_out(Q *&、char const *、char const *、char const *&、char *、char *、char *&)const'への未定義の参照、すべてのdo_*メンバー関数に対して繰り返されます。
StateTがそうでない場合std::mbstate_t
、コンパイルが機能するためにさらに必要な専門分野はどれですか?
c++ - ICU を使用して独自の codecvt ファセットを実装する
codecvt
ICU を使用してファセットを実装し、(ICU がサポートする) 文字エンコーディングを内部的に UTF-8 に変換したいと考えています。が存在し、この例codecvt_byname
に示すように、必要なことの一部を実行するために使用できることを認識しています。その例の問題点は、(1) ワイド文字ストリームを使用する (「通常の」バイト指向ストリームを使用したい) ことと、(2) 変換を実行するために 2 つのストリームが必要なことです。代わりに、次のような単一のストリームが必要です。
したがって、このような実装を行いたいのですが、ではなく ICU を使用しiconv
ます。それを考えると、私の実装do_in()
は次のとおりです。
our_state
オブジェクトは 2 つのポインタを保持しますUConverter*
。1 つは「外部」エンコーディング (この例では ISO-8859-1) 用で、もう 1 つは UTF-8 エンコーディング用です。
私の質問は次のとおりです。
nullptr
上記のように「ピボット」バッファを指定する必要がありますか、それとも独自のものを提供する必要がありますか?reset
引数 (現在はfalse
上記の最初のもの) を に設定する必要がある場合はいつになるかわかりませんtrue
。flush
引数 (現在はfalse
上の 2 番目) をに設定するタイミングをtrue
どのように知るか、つまり、入力の最後に到達したタイミングをどのように知るかは明確ではありません。
少しの援助?
c++ - ストリーム、stream_bufs、codecvtファセット、および\nから\r\nへの変換
C ++ IOストリームのどの部分\r
を\r\n
変換しますか?それ自体ですか、それともファセットstream_buf
による内部から外部へのエンコーディング変換の一部ですか?codecvt
更新1
あなたは皆、それがstreambuf/filebufで行われると言います。Ok。しかし、この配置は、たとえばUTF-16のような外部エンコーディングをどのように処理しますか?ios::binary
次に、翻訳を無効にするフラグを付けてファイルを開く必要があるようです。