Closed
Description
What
When I imported this article, fenced code blocks became code spans.
The below is the result and 4 points are changed, but Qiita Sync Check has passed.
original
#### version1の場合
3パターンとも、`response.body.encoding`が`ASCII-8BIT`となっているため、encodeの処理で`Encoding::UndefinedConversionError`が発生してしまいました。
ログは一部加工、抜粋しています。
```
[DEBUG] request /utf8
I, [2021-12-06T08:04:12.927085 #46311] INFO -- request: GET http://localhost:4567/utf8
I, [2021-12-06T08:04:12.952143 #46311] INFO -- response: content-type: "text/html;charset=utf-8"
[DEBUG] response.body.encoding, ASCII-8BIT
faraday_test.rb:12:in `encode': "\\xE6" from ASCII-8BIT to UTF-8 (Encoding::UndefinedConversionError)
from faraday_test.rb:12:in `<main>'
```
```
[DEBUG] request /shift-jis
I, [2021-12-06T08:04:55.299555 #46671] INFO -- request: GET http://localhost:4567/shift-jis
I, [2021-12-06T08:04:55.330637 #46671] INFO -- response: content-type: "text/html;charset=shift_jis"
[DEBUG] response.body.encoding, ASCII-8BIT
faraday_test.rb:17:in `encode': "\\x95" from ASCII-8BIT to UTF-8 (Encoding::UndefinedConversionError)
from faraday_test.rb:17:in `<main>'
```
```
[DEBUG] request /shift-jis-no-charaset
I, [2021-12-06T08:05:44.666735 #47028] INFO -- request: GET http://localhost:4567/shift-jis-no-charaset
I, [2021-12-06T08:05:44.690953 #47028] INFO -- response: content-type: "text/html"
[DEBUG] response.body.encoding, ASCII-8BIT
faraday_test.rb:22:in `encode': "\\x95" from ASCII-8BIT to UTF-8 (Encoding::UndefinedConversionError)
from faraday_test.rb:22:in `<main>'
```
### version2の場合
faradayとfaraday-net_httpのバージョンを2にupdateして検証します。
すると、Content-Typeが設定されているときは適切にbodyの文字コードが設定されているため、encodeにも成功しています。
```
[DEBUG] request /utf8
I, [2021-12-06T08:07:58.076577 #47801] INFO -- request: GET http://localhost:4567/utf8
I, [2021-12-06T08:07:58.105417 #47801] INFO -- response: content-type: "text/html;charset=utf-8"
[DEBUG] response.body.encoding, UTF-8
[DEBUG] response.body
<!DOCTYPE html><html lang="ja"><head><title>charaset utf-8</title><meta charset="utf-8" /></head><body><p>文字コードは UTF-8 です ☺</p></body></html>
```
```
[DEBUG] request /shift-jis
I, [2021-12-06T08:07:58.106100 #47801] INFO -- request: GET http://localhost:4567/shift-jis
I, [2021-12-06T08:07:58.113733 #47801] INFO -- response: content-type: "text/html;charset=shift_jis"
[DEBUG] response.body.encoding, Shift_JIS
[DEBUG] response.body
<!DOCTYPE html><html lang="ja"><head><title>charaset Shift_JIS</title><meta charset="shift-jis" /></head><body><p>文字コードは Shift_JIS です </p></body></html>
```
ただし、設定されていない場合は依然として`Encoding::UndefinedConversionError`が発生してしまいました。
そのため、レスポンスヘッダーのContent-Typeに文字コードが設定されていなくても厳密にHTMLの文字コードを判定したい場合は、body内に含まれるcharsetの記述を参照して、force_encodingをする必要があります。
```
[DEBUG] request /shift-jis-no-charset
I, [2021-12-06T08:07:58.114818 #47801] INFO -- request: GET http://localhost:4567/shift-jis-no-charset
I, [2021-12-06T08:07:58.120169 #47801] INFO -- response: content-type: "text/html"
[DEBUG] response.body.encoding, ASCII-8BIT
faraday_test.rb:22:in `encode': "\\x95" from ASCII-8BIT to UTF-8 (Encoding::UndefinedConversionError)
from faraday_test.rb:22:in `<main>'
```
imported
#### version1の場合
3パターンとも、`response.body.encoding`が`ASCII-8BIT`となっているため、encodeの処理で`Encoding::UndefinedConversionError`が発生してしまいました。
ログは一部加工、抜粋しています。
```
[DEBUG] request /utf8
I, [2021-12-06T08:04:12.927085 #46311] INFO -- request: GET http://localhost:4567/utf8
I, [2021-12-06T08:04:12.952143 #46311] INFO -- response: content-type: "text/html;charset=utf-8"
[DEBUG] response.body.encoding, ASCII-8BIT
faraday_test.rb:12:in `encode': "\\xE6" from ASCII-8BIT to UTF-8 (Encoding::UndefinedConversionError)
from faraday_test.rb:12:in `<main>'
```
`
[DEBUG] request /shift-jis
I, [2021-12-06T08:04:55.299555 #46671] INFO -- request: GET http://localhost:4567/shift-jis
I, [2021-12-06T08:04:55.330637 #46671] INFO -- response: content-type: "text/html;charset=shift_jis"
[DEBUG] response.body.encoding, ASCII-8BIT
faraday_test.rb:17:in `encode': "\\x95" from ASCII-8BIT to UTF-8 (Encoding::UndefinedConversionError)
from faraday_test.rb:17:in `<main>'
```
[DEBUG] request /shift-jis-no-charaset
I, [2021-12-06T08:05:44.666735 #47028] INFO -- request: GET http://localhost:4567/shift-jis-no-charaset
I, [2021-12-06T08:05:44.690953 #47028] INFO -- response: content-type: "text/html"
[DEBUG] response.body.encoding, ASCII-8BIT
faraday_test.rb:22:in `encode': "\\x95" from ASCII-8BIT to UTF-8 (Encoding::UndefinedConversionError)
from faraday_test.rb:22:in `<main>'
```
### version2の場合
faradayとfaraday-net_httpのバージョンを2にupdateして検証します。
すると、Content-Typeが設定されているときは適切にbodyの文字コードが設定されているため、encodeにも成功しています。
```
[DEBUG] request /utf8
I, [2021-12-06T08:07:58.076577 #47801] INFO -- request: GET http://localhost:4567/utf8
I, [2021-12-06T08:07:58.105417 #47801] INFO -- response: content-type: "text/html;charset=utf-8"
[DEBUG] response.body.encoding, UTF-8
[DEBUG] response.body
<!DOCTYPE html><html lang="ja"><head><title>charaset utf-8</title><meta charset="utf-8" /></head><body><p>文字コードは UTF-8 です ☺</p></body></html>
```
`
[DEBUG] request /shift-jis
I, [2021-12-06T08:07:58.106100 #47801] INFO -- request: GET http://localhost:4567/shift-jis
I, [2021-12-06T08:07:58.113733 #47801] INFO -- response: content-type: "text/html;charset=shift_jis"
[DEBUG] response.body.encoding, Shift_JIS
[DEBUG] response.body
<!DOCTYPE html><html lang="ja"><head><title>charaset Shift_JIS</title><meta charset="shift-jis" /></head><body><p>文字コードは Shift_JIS です </p></body></html>
`
ただし、設定されていない場合は依然として`Encoding::UndefinedConversionError`が発生してしまいました。
そのため、レスポンスヘッダーのContent-Typeに文字コードが設定されていなくても厳密にHTMLの文字コードを判定したい場合は、body内に含まれるcharsetの記述を参照して、force_encodingをする必要があります。
```
[DEBUG] request /shift-jis-no-charset
I, [2021-12-06T08:07:58.114818 #47801] INFO -- request: GET http://localhost:4567/shift-jis-no-charset
I, [2021-12-06T08:07:58.120169 #47801] INFO -- response: content-type: "text/html"
[DEBUG] response.body.encoding, ASCII-8BIT
faraday_test.rb:22:in `encode': "\\x95" from ASCII-8BIT to UTF-8 (Encoding::UndefinedConversionError)
from faraday_test.rb:22:in `<main>'
```