問題タブ [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.

0 投票する
1 に答える
1317 参照

c++11 - char16_t配列で上へ

綺麗にする方法はありますか?Boost の を使おうとするto_upper()と が得られるstd::bad_castので、次のようにして終了しました。

が元の文字と同じサイズto_upperであることが保証されているかどうかがわからないため、これが正しいかどうかさえわかりません。char16_tそして、それが次の文字の上書きを引き起こすのか、最後の文字の後半を読み直すのかはわかりません。ばかげた質問で申し訳ありませんが、ランダム アクセスと可変長エンコーディングを持つ char 型に関しては問題があります。

0 投票する
5 に答える
31060 参照

c++ - wchar_tをintに変換します

wchar_t()を()'9'の形式の数字に変換するにはどうすればよいですか?int9

peek数字かどうかを確認する次のコードがあります。

減算することはできます'0'か、それとも心配すべきUnicodeの詳細がありますか?

0 投票する
2 に答える
263 参照

c - C ワイド文字 - 使い方は?

このコードを使用して単一の文字を出力できます。

文字列を出力するようにコードを適応させるにはどうすればよいですか?

何かのようなもの

0 投票する
1 に答える
18982 参照

c++ - wchar_tを文字列に変換しますか?

wchar_t変換したいのですがstring。次に、を使用して文字列を読み取る必要がありますstringstream。私はここでそれを変換することを検討しました:http://msdn.microsoft.com/en-us/library/ms235631 (v = vs.80).aspxしかし、それらのどれもで使用可能なものを返しませんstringstream。私はコーディングの経験があまりないので、おそらく本当に単純なものが欠けています。

前もって感謝します!

0 投票する
2 に答える
1134 参照

c - wsprintfからフォーマットされた文字列の長さを取得する

標準char*の文字列を使用する場合、snprintfand関数は、オーバーフローのためにその文字列が切り捨てられた場合でも、出力文字列の長さを返します。* ISO C委員会は、andvsnprintfを追加したときにこの機能を気に入らなかったようです。オーバーフロー時。swprintfvswprintf

この長さを提供する関数を知っている人はいますか?潜在的な文字列のサイズがわかりません。私はあまりにも多くを求めているかもしれませんが、..私はむしろしたくない:

  • 巨大な静的一時バッファを割り当てます
  • 適合するサイズが見つかるまで、メモリを繰り返し割り当てて解放します
  • ライブラリの依存関係を追加する
  • 独自のフォーマット文字列パーサーを作成する

* MSVCはこれを行わず、代わりにscprintfvscprintf関数を提供しますが、他のコンパイラ、主にGCCを探しています。

0 投票する
4 に答える
13468 参照

c++ - WChars、エンコーディング、標準、および移植性

以下は、SOの質問とは見なされない場合があります。範囲外の場合は、遠慮なくお立ち寄りください。ここでの質問は、基本的に「C規格を正しく理解しているか、これが正しい方法であるか」です。

C(したがって、C++およびC++ 0x)での文字処理についての私の理解について、明確化、確認、および修正をお願いしたいと思います。まず、重要な観察事項:

移植性とシリアル化は直交する概念です。

ポータブルなものは、C 、、、のようなものunsigned intですwchar_t。シリアル化可能なものは、uint32_tまたはUTF-8のようなものです。「ポータブル」とは、サポートされているすべてのプラットフォームで同じソースを再コンパイルして動作する結果を得ることができることを意味しますが、バイナリ表現は完全に異なる場合があります(または、TCP-伝書鳩など、存在しない場合もあります)。一方、シリアル化可能なものは常に同じ表現になります。たとえば、Windowsデスクトップ、電話、または歯ブラシで読み取ることができるPNGファイルです。ポータブルなものは内部であり、シリアル化可能なものはI/Oを処理します。ポータブルなものは型の安全であり、シリアル化可能なものは型のパンニングが必要です。</ preamble>

Cでの文字処理に関しては、移植性とシリアル化にそれぞれ関連する2つのグループがあります。

  • wchar_t、、/ : C標準setlocale()「エンコーディング」について何も述べていません; 実際、テキストやエンコーディングのプロパティにはまったく依存しません。「エントリポイントは、システムのすべての文字を保持できる型を取得します。入力文字シーケンスを読み取り、それらを実行可能なwstringにする関数を取得します。その逆も同様です。mbsrtowcs()wcsrtombs()main(int, char**)wchar_t

  • iconv()およびUTF-8,16,32:明確に定義された明確な固定エンコーディング間でトランスコードする関数/ライブラリ。iconvによって処理されるすべてのエンコーディングは、1つの例外を除いて、普遍的に理解され、合意されています。

wchar_tポータブルな文字タイプを持つCのポータブルでエンコードにとらわれない世界と、決定論的な外の世界との間の架け橋は、WCHAR-TとUTFの間のiconv変換です。

したがって、文字列を常にエンコーディングに依存しないwstringに内部的に格納し、を介してCRTとインターフェイスし、シリアルwcsrtombs()化に使用する必要がありますiconv()か?概念的に:

実際には、これは、プログラムのエントリポイント用に2つの定型ラッパーを作成することを意味します。たとえば、C++の場合です。

これは、純粋な標準C / C ++のみを使用し、iconvを使用してUTFへの明確に定義されたI / Oインターフェイスを使用して、慣用的でポータブル、ユニバーサル、エンコーディングに依存しないプログラムコアを作成する正しい方法ですか?(Unicodeの正規化や発音区別符号の置換などの問題は範囲外であることに注意してください。 (他のコーディングシステムとは対照的に)実際にUnicodeが必要であると判断した後でのみ、専用ライブラリを使用するなど、これらの詳細に対処する必要があります。 libicuのように。)

更新

多くの非常に素晴らしいコメントに続いて、いくつかの所見を追加したいと思います。

  • アプリケーションで明示的にUnicodeテキストを処理する場合iconvは、コアの-conversion部分を作成し、UCS-4で内部的にuint32_t/ char32_t-stringsを使用する必要があります。

  • Windows:幅の広い文字列を使用することは一般的に問題ありませんが、コンソール(さらに言えば、任意のコンソール)との対話は制限されているようです。これは、実用的なマルチバイトコンソールエンコーディングがサポートされていないようであり、mbstowcs本質的に役に立たないためです(その他些細な拡大よりも)。たとえば、Explorer-dropと一緒にワイドストリング引数を受け取ると、GetCommandLineW+CommandLineToArgvWが機能します(おそらく、Windows用に別のラッパーが必要です)。

  • ファイルシステム:ファイルシステムにはエンコーディングの概念がないようで、ファイル名としてnullで終了する文字列を使用するだけです。ほとんどのシステムはバイト文字列を取りますが、Windows/NTFSは16ビット文字列を取ります。存在するファイルを検出するとき、およびそのデータを処理するときは注意する必要があります(たとえばchar16_t、有効なUTF16を構成しないシーケンス(たとえば、裸のサロゲート)は有効なNTFSファイル名です)。標準Cfopenは、すべての可能な16ビット文字列にマップされる可能性のある変換がないため、すべてのNTFSファイルを開くことはできません。Windows固有の使用_wfopenが必要になる場合があります。当然の結果として、そもそも「文字」の概念がないため、一般に、特定のファイル名を構成する「文字数」の明確な概念はありません。買い手責任負担。

0 投票する
3 に答える
295 参照

visual-c++ - Unicodeとフレームワークに関する計り知れない問題

非常に奇妙な問題が発生しています...次の簡単なテストコードは、単一のCocoaアプリケーションに挿入された場合は正常に機能しますが、フレームワークの1つで使用すると、まったく予期しない結果が得られます...


どうしてこれができるのか、私は怒ったのか?メモリが破損したとしても、スタックに割り当てられたこれらすべての値を破損する可能性はありません... wcslen(L "MyWideString")でさえ機能しないのはなぜですか?テスト文字列を変更するとその長さが変更されますが、常に間違っています。wcstombsは-1を返します。

setlocale()はどこにも使用されていません。移植を容易にするために、テスト文字列にはASCII文字のみが含まれています。-fshort-wcharコンパイラオプションを使用しますが、Cocoaアプリケーションのテストでは正常に機能します...

助けてください!

0 投票する
3 に答える
4958 参照

android-ndk - AndroidNDKでstd::wstringサポートが欠落している場合の解決策?

何千もの場所で基本的な文字列型としてstd::wstringを使用し、wchar_tとその関数(wcsicmp()wcslen()vsprintf()など)を操作するゲームがあります。

問題は、wstringがR5c(この書き込みの時点で最新のndk)でサポートされていないことです。

国際化のためにstd::stringを使用するようにコードを変更できず、多くのゲームで使用されているゲームエンジンを壊してしまいます...

どのオプションがありますか?

1-stringとwstringを独自の文字列クラスに置き換えます

これにより、プラットフォームの独立性が向上しますが、ホイールを再実装するのはばかげています。私はすでに文字列のCOW実装から始めました。hash_mapsのキーとして使用するため、COWである必要があります。もちろん、これは多くの作業とエラーが発生しやすいです...しかし、それは私ができることのようです。

2-C標準ライブラリ(wcslen、mbstowcs ...)のワイド文字列関数の独自の実装を使用してSTLPortを再コンパイルするNDKを修正してみてください

これは好ましい方法です...しかし、私はそれを行う方法がわかりません:(

libstdc ++。aまたはlibstlport_static.aの関数(たとえばwcslen)を置き換えるにはどうすればよいですか?(どこにあるかわからない:()

また、どの関数を再実装する必要があるのか​​わからないので、wcslenが機能していないことはわかっているので、すべてである必要があると思います...

3-他に何かアイデアはありますか?

これに対する公式の修正を待つことはできません。#2の方法がわからない場合は、オプション#1を選択する必要があります。

2.3をターゲットにするとwstringsを使用できるとどこかで読んだことがありますが、Android2.1をターゲットにする必要があります。

PS:もちろんSTLを使用する必要があると言うのを忘れましたが、RTTIはなく、例外なく生きることができます。

前もって感謝します!

0 投票する
1 に答える
1236 参照

iphone - NSString を TCHAR との間で変換する方法 (CLucene を使用)

CLuceneC++ライブラリをインポートした iPhone 用のアプリケーションを開発しています。ほとんどすべての機能CLuceneが必要です。StringTCHAR*

NSStringこのタイプのデータとの間の変換に問題があります。私は多くの解決策を検索しましたが、どれもうまくいきませんでした。

この変換の仕方を教えてください。

テスト文字列定義のwith _T()マクロでライブラリを機能させることができました。ただし、XCodeは私に次のことを教えてくれます:

それを行う非推奨の方法はどれですか?

ありがとうございました!

編集:私はこのように解決しました:

NSStringからへの変換TCHAR*:

TCHAR*からへの変換NSString:

ありがとう!

0 投票する
2 に答える
991 参照

c++ - 機能するベクトルを作成するにはどうすればよいですかそれはerase(size_t pos)メソッドを持っていますか?

wstringWin32用にクロスコンパイルするmingwバージョン4.3.0で使用するC++クラスを作成しています。文字列を次のように機能さstd::stringせたいのです。erase(int pos)つまり、位置にある単一の要素を消去するメソッドが必要ですpos

これが私の最初の試みです:

これは私にはうまくいくように見えますが、コンパイルしようとすると、このwackoコンパイラエラーが発生します。

本当に奇妙なのは、メソッドを取り出してeraseコードをインライン化するだけで問題がないことです。

不思議です。