[Date Prev][Date Next][Thread Prev][][Date Index][Thread Index]

Re: Location =?utf-8?b?44Gu5paH5a2X5YyW44GR?=



In [emacs-w3m : No.12630]
On Sun, 19 Feb 2017 20:40:47 +0900, 白井さん wrote:
> Emacs-26 だと

>>> (string-make-unibyte STRING)

>>> This function is obsolete since 26.1;
>>> use `encode-coding-string'.

> なのですね。。。

おそらくこの文句を書いたと思われる Stefan Monnier さんが今日
rfc2047.el でこんな変更を行ないました:
<http://lists.gnu.org/archive/html/emacs-diffs/2017-05/msg00395.html>

-      (string-to-multibyte string))))
+      (if (multibyte-string-p string)
+          string
+        (decode-coding-string string 'us-ascii)))))

じっくり検証していませんが、たぶん string-(as|make|to)-multibyte
の置き換えはそれでいいんでしょう。

これに触発されて emacs-w3m に唯一残っている string-make-unibyte
の置き換えに再度挑戦。そうしたら、ひょんなことから insert の doc
string にこんなことが書かれているのを発見:

If the current buffer is multibyte, unibyte strings are converted
to multibyte for insertion (see ‘string-make-multibyte’).
If the current buffer is unibyte, multibyte strings are converted
to unibyte for insertion (see ‘string-make-unibyte’).

そして

> 最近の環境は Emacs-25.1 なのですが、ふと気づいたら、*w3m* の一番
> 上の Location: が文字化けしていました。例えば、

> http://www.google.co.jp/search?q=テスト&lr=lang_ja&hl=ja&oe=UTF-8&tbs=lr:lang_1ja
> https://ja.wikipedia.org/wiki/テスト

> などの「テスト」部分です。

この文字化けの根は、"%E3%83%86%E3%82%B9%E3%83%88" を "テスト" と
いう文字列にデコードする関数 w3m-url-decode-string にあることが
わかりました。

今までは "%E3" などの各 byte をデコードして、multibyte の環境で
それらを concat していたので、"テ" に相当する 3-byte "%E3%83%86"
の一部だけが multibyte 表現になってしまっていたのです。そういう
ものを正しく decode-coding するために string-make-unibyte を使っ
ていたわけですね。

これもまた、じっくり検証していませんが、

(string-(as|make|to)-multibyte STRING)

は

(with-temp-buffer
  (set-buffer-multibyte nil)
  (insert STRING)
  (buffer-string))

で置き換え可能のように思えます (use `encode-coding-string' と
いう文句に、私はまだ懐疑的です)。

で、それはそれとして、emacs-w3m ではもっとスマートに解決してみま
した (CVS)。
-- 
山岡