問題タブ [wchar-t]
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++ - C++ でのクロスプラットフォーム文字列 (および Unicode)
というわけで、ようやくメインのタスクに戻りました。かなり大きな C++ プロジェクトを Windows から Mac に移植することです。
すぐに、wchar_t が Windows では 16 ビットですが、Mac では 32 ビットであるという問題に遭遇しました。すべての文字列が wchar_t で表され、Windows マシンと Mac マシンの間で (ディスク上のデータとネットワーク データの両方の形式で) 文字列データが行き来するため、これは問題です。データを送受信する前に文字列を一般的な形式に変換するのは、その仕組み上、簡単ではありません。
また、最近ではさらに多くの言語をサポートし始めているため、多くの Unicode データを処理し始めています (右から左へ記述する言語も処理しています)。
さて、ここで複数のアイデアを混同して、必要以上に自分自身に問題を引き起こしている可能性があるため、この質問をしています. メモリ内のすべての文字列データを UTF-8 として保存することは非常に理にかなっていると考えています。これは、サイズが異なる wchar_t の問題を解決します。これは、複数の言語を簡単にサポートできることを意味し、メモリ フットプリントを劇的に削減します (多くの - 主に英語の - 文字列がロードされています) - しかし、多くの人がそうしているようには見えません。これ。何か足りないものはありますか?文字列の長さが、その文字列データを格納するメモリ サイズよりも小さくなる可能性がある場合に対処しなければならない明らかな問題があります。
それとも、UTF-16 を使用する方がよいのでしょうか? それとも、wchar_t に固執し、wchar_t と、たとえば、ディスクまたはネットワークに対して読み取り/書き込みを行う場所で Unicode との間で変換するコードを作成する必要がありますか?
これは危険なほど意見を求めることに近いことを認識しています - しかし、多くの Unicode 文字列クラス (たとえば) があるようには見えないため、明白な何かを見落としているのではないかと心配しています - しかし、変換するためのコードはたくさんあります/boost::locale、iconv、utf-cpp、ICU などの Unicode から。
c++ - wchar_t* を std::string に変換するにはどうすればよいですか?
クラスを std::string を使用するように変更しました (ここで得た回答に基づいていますが、私が持っている関数は wchar_t * を返します。それを std::string に変換するにはどうすればよいですか?
私はこれを試しました:
しかし、エラー C2440: 'initializing' : cannot convert from 'wchar_t *' to 'std::basic_string<_Elem,_Traits,_Ax>' と表示されます
visual-studio-2010 - wchar_tは、Visual Studioでは2バイトであり、UTF-16を格納します。Unicode対応アプリケーションはU+FFFFより上の文字でどのように機能しますか?
私たちは、アプリケーションをUnicode対応にすることを計画しており、発生する問題を分析しています。
wchar_t
特に、私たちのアプリケーションは、たとえば文字列の長さに大きく依存するため、基本文字クラスとして使用したいと思います。
この問題は、UTF-16で16ビットの2単位で格納する必要のある文字、つまりU+10000を超える文字を処理するときに発生します。
簡単な例:
UTF-8文字列"蟂"(Unicode文字U + 87C2、UTF-8:E8 9F 82)があります
そこで、次のコードを設定します。
さて、これは機能し、16ビットを2回割り当て、のバッファにwchar_t
は{0x87c2、0x0000}が含まれています。それをaの中に保存しstd::wstring
てサイズを計算すると、1になります。
ここで、UTF-8:F0 90 92 A2の入力として文字(U + 104A2)を使用します。
今回は、3つのwchar_tにスペースを割り当て、std :: wstring :: sizeは、文字が1つしかないことを考慮しても、 2を返します。
これには問題があります。UTF-8でデータを受信すると仮定します。に等しいバイトをカウントしないだけで、Unicode文字をカウントできます10xxxxxx
。そのデータを配列にインポートして処理したいと思いwchar_t
ます。文字数に1を足した数を割り当てるだけなら、安全かもしれません...誰かがU+FFFFより上の文字を使用するまで。そして、バッファが短すぎて、アプリケーションがクラッシュします。
それで、同じ文字列で、異なる方法でエンコードされた場合、文字列内の文字をカウントする関数は異なる値を返しますか?
この種の煩わしさを回避するために、Unicode文字列で動作するアプリケーションはどのように設計されていますか?
返信ありがとうございます。
c++ - 競合:C ++標準およびWindows実装でのwchar_t文字列の定義?
c++2003から2.13
ワイド文字列リテラルのタイプは「<strong>arrayofn const wchar_t」であり、静的ストレージ期間があります。ここで、nは以下に定義されている文字列のサイズです。
ワイド文字列リテラルのサイズは、エスケープシーケンス、ユニバーサル文字名、およびその他の文字の総数に、終了するL'\0'の1つを加えたものです。
c ++0x2.14.5から
ワイド文字列リテラルのタイプは「<strong>arrayofn const wchar_t」です。ここで、nは以下に定義されている文字列のサイズです。
char32_tまたはワイド文字列リテラルのサイズは、エスケープシーケンス、ユニバーサル文字名、およびその他の文字の総数に、終了するU'\0'またはL'\0'の1つを加えたものです。
char16_t文字列リテラルのサイズは、エスケープシーケンス、ユニバーサル文字名、およびその他の文字の総数に、サロゲートペアを必要とする各文字に1つ、および終了u'\0'に1つを加えたものです。
C++2003の記述はかなりあいまいです。ただし、C ++ 0xでは、文字列の長さをカウントする場合、ワイド文字列リテラルwchar_tはchar32_tと同じように扱われ、char16_tとは異なります。
https://stackoverflow.com/questions/402283?tab=votes%23tab-topにWindowsがwchar_tを実装する方法を明確に述べた投稿があります
つまり、Windowsのwchar_tは16ビットであり、UTF-16を使用してエンコードされます。標準のステートメントは、明らかにWindowsで何か矛盾するものを残しています。
例えば、
これは16ビットを超えており、UTF-16の場合、エンコードするには2つの16ビットが必要です(サロゲートペア)。
ただし、標準では、kkは2つのwchar_tの配列です(ユニバーサル名\ U000E005の場合は1、\ 0の場合は1)。
ただし、内部ストレージでは、Windowsはそれを格納するために3つの16ビットwchar_tオブジェクト、代理ペア用に2つのwchar_t、および\0用に1つのwchar_tを必要とします。したがって、配列の定義から、kkは3つのwchar_tの配列です。
どうやら互いに矛盾しているようです。
Windowsの最も簡単な解決策の1つは、wchar_tでサロゲートペアを必要とするものをすべて「禁止」することです(BMP外のUnicodeを「禁止」する)。
私の理解に何か問題がありますか?
ありがとう。
c - Linux /関連プラットフォームのコードでwchar_tが広く使用されていないのはなぜですか?
これは私に興味をそそられるので、私は尋ねるつもりです-wchar_t
なぜそれがWindowsのようにLinux / Linuxのようなシステムでそれほど広く使われていないのですか?具体的には、Windows APIはwchar_t
内部的に使用しますが、Linuxは使用しないと思います。これは、char
型を使用する多くのオープンソースパッケージに反映されています。
私の理解ではc
、それを表すために複数のバイトを必要とする文字が与えられた場合、char[]
フォームc
はのいくつかの部分に分割されますがchar*
、では単一のユニットを形成しwchar_t[]
ます。wchar_t
では、いつも使うのは簡単ではないでしょうか。この違いを否定する技術的な理由を見逃したことがありますか?それとも、それは単なる養子縁組の問題ですか?
c++ - C++での型の変換エラー
Format()を使用する必要があるプログラムがあります。文字列リテラルとintをCString変数に結合する関数。私はこれを行うためのいくつかの異なる方法を試しました、それらのコードはここにあります:
最初のものはエラーC2664を返します:'void ATL :: CStringT :: Format(const wchar_t *、...)':パラメータ1を'constchar[33]'から'constwchar_t*'に変換できません
2つ目は、エラーはありませんが、テキストは漢字で表示されます。
3番目はエラーC2440を返します:'static_cast':'constchar[33]'から'wchar_t'に変換できません
CStringsをwchar_t*sに変換するためのアイデアはありますか?
ありがとう
c - asprintfのwchar_tバージョンはありますか?
自分で長さを計算するのではなく、ターゲット文字列を適切に割り当てることができるように、フォーマットされた文字列の最終的な長さを返すC関数が必要です。文字列全体を書き込めない場合にこれを行うものがありsnprintf
ますが、残念ながら、それに代わるワイド文字はありません。
swprintf
エラーの場合、必要な長さではなく-1を返します(同じ動作をしないのはなぜですか?!?)
言及されたタイトルasprintf
は、非ワイドバージョンのみを提供するため、役に立たないようです。
_vscwprintf
Windowsで使用できますが、クロスプラットフォーム、標準バージョン、または少なくともLinuxバージョンが必要です。コードを#ifdefします。
何か案は?ありがとう!
c++ - wchar_t の配列
wchar_t の配列が欲しいです。
以下の作品:
しかし、これはしません
エラーは発生しませんが、wcAltFinalText は不適切な ptr です
ヘルプとコメントは大歓迎です。
c++ - ベクトルの wchar_t* の割り当てを解除します
次のような wchar_t* のベクトルがあります。
文字列を取得してベクターに挿入する関数
プログラムを閉じるとき、メモリリークが発生しないように、ベクトルの割り当てられたメモリを削除する必要があります。これを行うには、これを実行しようとしています:
それはコンパイルされ、すべて正常に動作しますが、メモリの割り当てを解除するときに、ランタイム エラーが発生します。
エラー http://k.min.us/iklWGE.png
なぜ?どうすればこれを修正できますか?
c++ - C++ exe の Unicode の問題 (MSVC++2010)
どこから来たのかわからない奇妙な問題があります。MSVC++2010 プロジェクトで一部の設定を変更した可能性がありますが、すべて問題ないようです。
現在、Windows SDK 6.1 に含まれている VSHADOW.EXE 3.0 ツールを試しています。これは C++ で書かれた一種のバックアップ プログラムで、その中の文字列はwchar_t
s で構成されています。現在、プログラムに渡す引数 ( など-q
) は、プログラム内で常に日本語記号の文字列になります。これは、cmd を使用して通常どおりプログラムを起動した場合に発生しますが、Visual Studio プロジェクト設定でコマンドライン引数を指定してデバッガーを起動した場合にも発生します。
誰かがこの問題を解決する方法を知っていますか? ありがとう!