[#43996] ある日付の最終時刻の求め方 (秒単位) — SATOH Fumiyasu <fumiyas@...>

さとうふみやす @ OSS テクノロジです。

14 messages 2007/09/05
[#43998] Re: ある日付の最終時刻の求め方 (秒単位) — "GOTO Kentaro" <gotoken@...> 2007/09/05

07/09/05 に SATOH Fumiyasu<fumiyas@osstech.jp> さんは書きました:

[ruby-list:44026] Re: iconvの多言語対応状況に関する質問

From: irodori@...
Date: 2007-09-13 08:43:49 UTC
List: ruby-list #44026
本庄と申します。

At Thu, 13 Sep 2007 16:32:39 +0900,
S_Konno(今野 滋) wrote:
> iconvによる文字コード変換に関する質問です。
> 海外のwebpageの文字コードをユニコードに変換する際、直接のコマンド
> 
> `curl http://www.xinhuanet.com/ | iconv -f GB2312 -t UTF-8`
> 
> では、変換に成功するのですが、
> 
> require "iconv"
> Iconv.iconv("UTF8", "GB2312" , `curl http://www.xinhuanet.com/`)
> 
> では、失敗することがあります。

当方も Mac OS X ですが、上記 URI でしたら、iconv を直接実行してもエラー
になります。
curl のメッセージに埋もれていたのではないでしょうか?

  $ ruby -v
  ruby 1.8.2 (2004-12-25) [powerpc-darwin8.0]
  $ wget -q -O - http://www.xinhuanet.com/ | iconv -f GB2312 -t UTF-8 > /dev/null
  iconv: (stdin): cannot convert

> そこで、質問です
> 1. システムとruby(ruby1.6.8以降)の間で扱える文字コードの差分を知る方法は何かないでしょうか?

システムの実装に依存するとありますから、リンクしている libiconv のサポー
ト範囲と全く同じと考えて良いと思います。

> 2. require "iconv" の方で、エラーの発生を回避する方法は何かないでしょうか?

Iconv::IllegalSequence 例外をキャッチできるので、該当文字を無視するか
自力で変換して、残りの文字列を再度 iconv することになると思います。
こんな感じでしょうか?

#! /usr/bin/env ruby
require 'iconv'
require 'net/http'
instr = Net::HTTP.get('www.xinhuanet.com', '/')
conv = Iconv.new('UTF-8', 'GB2312')
outstr = ''
puts 'input: ' + instr.length.to_s + 'bytes.'
begin
  outstr += conv.iconv(instr)
rescue Iconv::IllegalSequence
  outstr += $!.success
  puts outstr.length.to_s + 'bytes converted (catch exception).'
  # エラー文字を処理後、残りの文字列を instr にセットする
  # ここでは GB2312 のコード体型がわからないので、
  # とりあえず 2byte 飛ばす
  instr = $!.failed[2,$!.failed.length]
  retry
end
puts outstr.length.to_s + 'bytes converted (finished).'
conv.close()

--
Eiji Honjoh

In This Thread