0

中国語、日本語、韓国語(CJK)、英語の文字を組み合わせたテキストファイルがあります。ファイルの英語文字を検証する必要があります。ファイルにCJK文字を含めることができるのは、テキストファイルのコメントを表す「$」文字で行が始まる場合のみです。ネットを検索すると、ワイド文字を読み取るために使用できるタイプfgetws()とタイプが見つかりました。wchar_t

Q1)しかし、CJK文字がテキストファイルにどのように格納されるのか、どのバイトオーダーなどであるのか疑問に思っています。

Q2)CJK文字をループするにはどうすればよいですか。Unicode文字は1〜6バイトである可能性があるため、i++は使用できません。

どんな助けでもいただければ幸いです。

どうもありがとう。

4

3 に答える 3

1

UTF-32 コードポイントのシーケンスとして UTF-8 ファイルを読み取る必要があります。例えば:

std::shared_ptr<FILE> f(fopen(filename, "r"), fclose);
uint32_t c = 0;
while (utf8_read(f.get(), c))
{
    if (is_english_char(c))
        ...
    else if (is_cjk_char(c))
        ...
    else
        ...
}

utf8_read署名がある場所:

bool utf8_read(FILE *f, uint32_t &c);

これutf8_readで、最初のバイトの値に応じて 1 ~ 4 バイトを読み取ることができます。アルゴリズムについてはhttp://en.wikipedia.org/wiki/UTF-8 、google を参照するか、既に利用可能なライブラリ関数を使用してください。

UTF-32 コードポイントを使用して、範囲を確認できるようになりました。英語の場合、それが ASCII ( c < 0x7F) であるか、Latin文字であるかを確認できます (フランス語などからインポートされた単語のアクセント付き文字のサポートを含む)。また、印刷できない制御文字 ( など) を除外することもできます0x01

Latinおよび/またはCJK文字チェックでは、文字が特定のコード ブロックに含まれているかどうかを確認できます (コードポイントの範囲については、http://www.unicode.org/Public/UNIDATA/Blocks.txt を参照してください) これが最も簡単な方法です。

スクリプト検出機能を備えた Unicode サポート付きのライブラリ (glib ライブラリなど) を使用している場合は、スクリプト タイプを使用して文字を検出できます。または、 http://www.unicode.org/Public/UNIDATA/Scripts.txtからデータを取得できます。

Name     : Code      : Language(s)
=========:===========:========================================================
Common   : Zyyy      : general punctuation / symbol characters
Latin    : Latn      : Latin languages (English, German, French, Spanish, ...)
Han      : Hans/Hant : Chinese characters (Chinese, Japanese)
Hiragana : Hira      : Japanese
Katakana : Kana      : Japanese
Hangul   : Hang      : Korean

注: スクリプト コードはhttp://www.iana.org/assignments/language-subtag-registry ( Type == 'script') から取得されます。

于 2012-10-09T12:08:44.630 に答える
0

UTF-8を理解し、UTF8 処理ライブラリを使用する (または独自にコーディングする) 必要があります。参考までに、 Glib (GTK から) には UTF-8 処理関数があり、可変長の UTF-8 文字と文​​字列を処理できます。GNU libc 内のiconvやICUなど、他にも UTF-8 ライブラリがあります。

UTF-8 は、中国語などのマルチバイト UTF8 文字のバイト順と内容を定義します。

于 2012-10-08T05:47:36.573 に答える
0

wchar_t の処理を​​説明するためにサンプル プログラムを貼り付けます。それが誰かを助けることを願っています。

#include <stdio.h>
#include <locale.h>
#include <wchar.h>
#define BUFLEN 1024
int main() {
  wchar_t *wmessage=L"Lets- beginめん(下) 震災後、保存-食で-脚光-(経済ナビゲーター)-lets- end";
  wchar_t warray[BUFLEN + 1];
  wchar_t a = L'z';
  int i=0;
  FILE *fp;
  wchar_t *token = L"-";
  wchar_t *state;
  wchar_t *ptr;
  setlocale(LC_ALL, "");
  /* FIle in current dirrctory containing CJK chars */
  fp = fopen("input", "r");
  if (fp == NULL) {
      printf("%s\n", "Cannot open file!!!");
      return (-1);
  }
  fgetws(warray, BUFLEN, fp);
  wprintf(L"\n *********************START reading from file*******************************\n");
  wprintf(L"%ls\n",warray);
  wprintf(L"\n*********************END reading from file*******************************\n");
  fclose(fp);
  wprintf(L"printing character %lc = <0x%x>\n", a, a);
  wprintf(L"\n*********************START Checking string for Japanese*******************************\n");
  for(i=0;wmessage[i] != '\0';i++) {
      if (wmessage[i] > 0x7F) {
          wprintf(L"\n This is non-ASCII <0x%x> <%lc>", wmessage[i],  wmessage[i]);
      } else {
          wprintf(L"\n This is ASCII <0x%x> <%lc>", wmessage[i],  wmessage[i]);
      }
  }
  wprintf(L"\n*********************END Checking string for Japanese*******************************\n");
  wprintf(L"\n*********************START Tokenizing******************************\n");
  state = wcstok(warray, token, &ptr);
  while (state != NULL) {
      wprintf(L"\n %ls", state);
      state = wcstok(NULL, token, &ptr);
  }
  wprintf(L"\n*********************END Tokenizing******************************\n");
  return 0;
}
于 2012-10-08T09:17:05.113 に答える