私は国際化プロジェクトに取り組んでいます。アラビア語や中国語などの他の言語では、0〜9以外の数字の表現方法が異なりますか?もしそうなら、これらの他の表現を説明するatoi()のバージョンがありますか?atoi()他の言語と
私は、主にユーザーからの入力の解析に関係していると付け加えます。ユーザーが他の表現形式で入力する場合、私はそれを数字として認識し、それに応じて扱います。
私は国際化プロジェクトに取り組んでいます。アラビア語や中国語などの他の言語では、0〜9以外の数字の表現方法が異なりますか?もしそうなら、これらの他の表現を説明するatoi()のバージョンがありますか?atoi()他の言語と
私は、主にユーザーからの入力の解析に関係していると付け加えます。ユーザーが他の表現形式で入力する場合、私はそれを数字として認識し、それに応じて扱います。
std::wistringstream
とロケールを使用してこの整数を生成することがあります。
#include <sstream>
#include <locale>
using namespace std;
int main()
{
locale mylocale("en-EN"); // Construct locale object with the user's default preferences
wistringstream wss(L"1"); // your number string
wss.imbue(mylocale); // Imbue that locale
int target_int = 0;
wss >> target_int;
return 0;
}
+1ですが、システムで使用可能なCロケールに大きく依存しています。 – rubenvb
国際的な文字が心配な場合は、_wtoi(..)などの「Unicode対応」機能を使用する必要があります。
UNICODEは(MSDNから)それは独立した入力にするためにサポートされている場合にも確認することができます。この例では
TCHAR tstr[4] = TEXT("137");
#ifdef UNICODE
size_t cCharsConverted;
CHAR strTmp[SIZE]; // SIZE equals (2*(sizeof(tstr)+1)). This ensures enough
// room for the multibyte characters if they are two
// bytes long and a terminating null character. See Security
// Alert below.
wcstombs_s(&cCharsConverted, strTmp, sizeof(strTmp), (const wchar_t *)tstr, sizeof(strTmp));
num = atoi(strTmp);
#else
int num = atoi(tstr);
#endif
は、標準C ライブラリ関数wcstombsはASCIIに Unicode文字を変換します。この例では、周囲のテキスト の一部ができない場合でも、数字0から 9は常に からUnicodeに変換できるという事実につき、 に依存しています。 atoi 関数は、 が数字ではない文字で停止します。
ユニコードで スクリプトのいくつかのために提供 ネイティブの数字が含まれたテキストを処理するために、国立 言語サポート(NLS)LCMapString 機能を使用することができるアプリケーション。
注意wcstombs関数 を誤って使用すると、アプリケーションのセキュリティが になります。 のアプリケーションバッファが8ビット文字列の文字列が (最小サイズ2 *(char_length +1)、 )であることを確認してください。ここで、char_lengthはUnicode文字列の長さを表します( )。 2バイト文字セット(DBCS)で の各Unicode文字を2つの連続した8ビット文字に に割り当てることができるため、制限が行われています。 バッファに 文字列全体が格納されていない場合、結果文字列は nullで終了し、セキュリティが という危険性があります。 アプリケーションセキュリティの詳細については、セキュリティ を参照してください。留意点:国際 機能。
私はVisual C++には、この切り替えの大部分を行うマクロがいくつか組み込まれていると思います。標準ソリューションの場合は – Brian
http://stackoverflow.com/questions/5068972/c-atoi-for-wide-chars-on-linux –
リンク上で説明する必要があります: 'wchar_t'の使用があなたのシステムで意味をなさないかどうかは依存しますあなたが使っているエンコーディングの種類。 UTF-8の場合、通常の 'strtol()'/'atoi()'はそうしますが、マルチバイト/定数サイズの文字セットを持っていれば、それはできません。 –