

Ruby on Railsで管理画面の開発をしています。  
DBはmssqlを使っていて、エリアの領域をポリゴンで保管しているカラムがあります。  
このカラムはmssqlのgeographyタイプになっています。  
このカラムの値をviewから表示しようとするとき、下記のようなエラーが出力されます。

> incompatible character encodings: ASCII-8BIT

上記のエラーを直すために、少し調べて「force_encoding("utf-8")」というのをつけたら上記のエラーは消えましたがまた新しいエラーが出力されました。

> invalid byte sequence in utf-8

これを直すためにはどうしたらいいいか教えてください。

下記は自分のコードの一部です。

[code]

    table.table
          .
          .
          .
       tr
         th エリア
         td = @test.Area.force_encoding("utf-8")
    
[/code]

モデル、コントローラなどはscaffoldで生成してあまり触ってません。  
あと、viewの所はslimを使っています。


CC BY-SA 3.0
2016-03-08T09:01:06.260
22926
2016-03-09T04:03:23.487
2016-03-09T02:37:33.440
5793
10710
question
ruby-on-rails
SQL Serverのgeographyデータ型をRailsで扱う方法


想像ですが、取得されたデータは文字列ではなくバイナリ値なのではないでしょうか。そうであれば、後に書くようにそのまま表示しようとしようが`force_encoding`しようがエンコーディング関係のエラーとなります。

独自データ型の扱いについてはコネクションアダプタが対応していればそちらのリファレンスに扱い方が載っているかもしれません。

* * *

`incompatible character
encodings`(`Encoding::CompatibilityError`)は互換性のないエンコーディング間で処理を行おうとしたときに出るエラーです。RailsのViewは普通UTF-8なので、そこにASCII-8BITの文字列を埋め込もうとするとこうなります。

`invalid byte sequence in
...`(`Encoding::InvalidByteSequenceError`)は、データの中身が指定されたエンコーディングにおいて不正な場合に発生します。

元のデータが「UTF-8なバイト列」であれば`#force_encoding('utf-8')`を行うことで正しく「UTF-8な文字列」にすることはできますが、元のデータがUTF-8として正しくなければ`InvalidByteSequenceError`になることになります。(注意が必要なのは、`InvalidByteSequenceError`は`#force_encoding`のタイミングではなく、その後になんらかの操作を行おうとした他タイミングで発生することです)


CC BY-SA 3.0
2016-03-09T04:03:23.487
22943
2016-03-09T04:03:23.487
5793
22926
answer