PureBasicでShiftJISをUnicodeへ変換


PureBasicでとあるページを読み込んで中のデータを抜き出す用事があたのだが、別のサイトの方が使い勝手がよさそうなのでそこから抜き出すことにした。
アクセス先のURIを書き換えて抜き出す部分をそのページ合わせて書き換えればOKだな、楽勝~と思ったけど、そこがShiftJISで記述されててこまった。
これまではUTF8なページだったので、そのまま使うと文字化けしてパタンマッチが使えない。

いろいろ調べてみたらWin32 APIのMultiByteToWideChar(), WideCharToMultiByte()を使っている例が見つかったので、それを参考にやってみたがうまく行かない。
> MultiByte to UTF-8

原因はPeekS(*MemoryID, length, #PB_UTF8)のままデータを文字列変数にいれてたこと。
ダサいね(^^;

PeekS(*MemoryID, length, #PB_Ascii)と#PB_UTF8を#PB_AsciiにすることでShiftJISな文字列をちゃんとUnicodeに変換してくれているようだ。

中でMultiByteToWideChar()を呼び出してたりするんだろうか。

というわけで、何日もうまく行かなくて悩んでたけど、実に簡単なことで悩んでた。俺の時間を返せ…

忘れて知ってまた時間を無駄にしないようにここにメモとして書いておく。
僕みたいにダサい人が見つけて助かるかもしれないしね。

Define.l *MemoryID
Define file$ = OpenFileRequester("Select a file","tmp.txt.sjis","Text (*.txt)|*.txt;*.sjis;*.utf8|All files (*.*)|*.*",0)
If file$
  If ReadFile(0, file$)
    length = Lof(0)                            ; get the length of opened file
    *MemoryID = AllocateMemory(length)         ; allocate the needed memory
    If *MemoryID
      bytes = ReadData(0, *MemoryID, length)   ; read all data into the memory block
      Debug "Number of bytes read: " + Str(bytes)
    EndIf
    CloseFile(0)
  EndIf
EndIf

If *MemoryID
  text.s = PeekS(*MemoryID, length, #PB_Ascii)
  Debug "file(sjis)=[" + text + "]"
  
  ShowMemoryViewer( @text, 100 )
EndIf

試してないけど、EUCを読み込んでもUnicodeに直してくれるんじゃないかな。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする