Skip to content

Fenced code blocks become code spans or sometimes broken #61

Closed
@kyntk

Description

@kyntk

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>'
```

Metadata

Metadata

Assignees

Labels

bugSomething isn't working

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions