0
4

1 に答える 1

4

UTF-8とUnicodeの間には混乱があります。デコードするとバイト%DB%81%DB%8C%D9%84%D9%88が得られます。どうやらこれはアラビア文字で構成されるUTF-8でエンコードされた文字列です。これをUTF-8として読み取り、Unicodeコードポイントにデコードすると、次のようになります。 0xDB 0x81 0xDB 0x8C 0xD9 0x84 0xD9 0x88

  • 0xDB 0x81→U+06C1アラビア文字hehゴール(ہ)、
  • 0xDB 0x8C→U+06CCアラビア文字farsiyeh(ہی)、
  • 0xD9 0x84→U+0644アラビア文字lam(ل)、
  • 0xD9 0x88→U+0648アラビア文字のワウ(و)。

これは、実際にデコードしているものと混同しないでください。

  • U + 00DBラテン大文字Uと曲折アクセント記号(Û)、
  • U + 0081
  • U + 0084
  • U + 0088
  • U + 008C
  • U + 00D9ラテン語の大文字のUと墓(Ù)、

さらに、Unixファイル名は実際には文字ではなくバイトで構成されています。したがって、これらの表示方法を選択するのはあなた次第です。

したがって、この場合の最も簡単な方法は、パーセントデコードをバイトに実行し、実際のUnicode文字に変換せずに、それらのバイトをファイル名として使用してディレクトリを作成することです。

動作する例を次に示します。

#include <sys/stat.h>
#include <string>

const int hex_value[256] = {
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0, 0, 0, 0,
  0,10,11,12,13,14,15
};

int main(int argc, char **argv)
{
  std::string str("%DB%81%DB%8C%D9%84%D9%88");

  size_t t = 0;
  for (size_t s = 0; s < str.size(); s++) {
    if (str[s] == '%' && s + 2 < str.size()) {
      str[t] = hex_value[str[s+1]] * 16 + hex_value[str[s+2]];
      s += 2;
    }
    else
      str[t] = str[s];
    t++;
  }
  str.resize(t);

  mkdir(str.c_str(), 0755);
}

それでも端末以外のものが表示ہیلوされる場合は、使用する文字セットに関して混乱しているのは端末である可能性があります。この考えられる混乱を解消するには、lsthroughの出力をパイプ処理し、hexdump期待するバイトが表示されることを確認します。

$ ls | hexdump
0000000 61 2e 6f 75 74 0a 63 6c 65 61 6e 2e 70 68 70 0a
…
00000c0 32 32 2e 63 6f 6d 3a 32 32 0a db 81 db 8c d9 84
00000d0 d9 88 0a                                       
00000d3

ここでは、最後に正しいファイル名がはっきりと表示されますdb 81 db 8c d9 84 d9 88 0a

于 2013-01-18T07:26:16.887 に答える