0

ファイルから文字列にコンテンツを追加しようとしています。

iso-8859-1 エンコーディングを使用してファイルを開き、文字列を同じエンコーディングに設定します。

しかし、値を連結しようとするとincompatible character encodings: UTF-8 and ISO-8859-1 (Encoding::CompatibilityError) エラーが発生します。

両方の文字列が同じエンコーディングの場合、なぜこれが起こるのですか?

実際にはそこに UTF-8 文字列はありません。

sql = "
INSERT INTO pages
(meta_title, meta_description, meta_keywords, title, URL, content)
VALUES ('%s', '%s', '%s', '%s', '%s', '%s');
".force_encoding('iso-8859-1') # setting string to iso-8859-1

Dir['./*'].select { |e| File.file? e }.each do |e|
  f = File.open(e, "r:iso-8859-1") # opening the file using iso-8859-1
  # extracting meta, title etc
  puts sql % [*meta, title, url, content]
end
4

2 に答える 2

1

抽出されたコンテンツにも明示的なエンコーディングを使用してみてください。

このような:

puts sql % [*meta, title, url, content].map { |s| s.force_encoding('iso-8859-1') }
于 2012-10-10T21:55:16.370 に答える
1

ファイルを扱う場合、外部エンコーディングと内部エンコーディングの 2 つのエンコーディングがあります。

外部エンコーディングは、ディスク上の実際のデータを処理します。ruby は、そのエンコーディングを使用して、ファイルから取得したバイトを解釈し、そのエンコーディングに書き込まれたバイトを変換します。

内部エンコーディングは、実行時に返される内容に影響しますf.read。内部エンコーディングが非 nil で、外部エンコーディングと異なる場合、ruby はファイルを読み取るときにトランスコードします。デフォルトEncoding.default_internalでは が使用されます。システムではこれが UTF-8 である必要があると想定しています。その結果、ruby はファイルを iso-8859-1 として読み取りますが、データを返す前に utf-8 にトランスコードします。

操作している大規模な環境に応じて、値を変更するか、Encoding.default_internal必要な内部エンコーディングを明示的に設定できます。

File.open(e, "r:iso-8859-1:iso-8859-1")

James Gray はこれに関するブログ記事を持っています (実際、Ruby の文字列エンコーディングに関する一連の記事があります)。

于 2012-10-10T21:59:45.710 に答える