Windowsでenc=utf-8の時に印刷が文字化けする #408

Closed
k-takata opened this Issue Jun 6, 2013 · 31 comments

Comments

Projects
None yet
4 participants
@k-takata
Member

k-takata commented Jun 6, 2013

utf-8 と印刷の文字化け(Windows)

Windowsの vimで内部エンコーディングを utf-8に設定した場合は、印刷を行うと日本語は文字化けします。

os_mswin.c の mch_print_text_out() を見たところ、文字コードの変換をせずにそのまま TextOut() で出力していました。

    int
mch_print_text_out(char_u *p, int len)
{
#ifdef FEAT_PROPORTIONAL_FONTS
    SIZE    sz;
#endif

    TextOut(prt_dlg.hDC, prt_pos_x + prt_left_margin,
                      prt_pos_y + prt_top_margin, p, len);

gui_w32.c の gui_mch_draw_string() と同じように UTF-16 に変換して出力するなどの対策が必要と思われます。

@mattn

This comment has been minimized.

Show comment
Hide comment
@mattn

mattn Jun 7, 2013

Member

いろいろしちめんどくさい事やってますね。MultiByteToWideCharだとダメだったんだろか。

Member

mattn commented Jun 7, 2013

いろいろしちめんどくさい事やってますね。MultiByteToWideCharだとダメだったんだろか。

@k-takata

This comment has been minimized.

Show comment
Hide comment
@k-takata

k-takata Jun 8, 2013

Member

いろいろしちめんどくさい事やってますね。

表示のためにいろいろ効率化を目指した結果でしょうか。

パッチを書いてみました。UTF-16 への変換は複雑なことはせず enc_to_utf16() のみを使っています。

https://bitbucket.org/k_takata/vim-win32-mq/src/9b18e1b227b1f2a3a60a8ef53506c3db093a5fbb/fix-windows-printing.patch?at=default

修正途中のパッチへのリンクを載せてしまっていたため、修正。

https://bitbucket.org/k_takata/vim-win32-mq/src/a11f5ea38acf24f121fbb55f88181ecfebd2591a/fix-windows-printing.patch?at=default

残念ながら、ページ番号の部分がまだ文字化けしています。
printing

Member

k-takata commented Jun 8, 2013

いろいろしちめんどくさい事やってますね。

表示のためにいろいろ効率化を目指した結果でしょうか。

パッチを書いてみました。UTF-16 への変換は複雑なことはせず enc_to_utf16() のみを使っています。

https://bitbucket.org/k_takata/vim-win32-mq/src/9b18e1b227b1f2a3a60a8ef53506c3db093a5fbb/fix-windows-printing.patch?at=default

修正途中のパッチへのリンクを載せてしまっていたため、修正。

https://bitbucket.org/k_takata/vim-win32-mq/src/a11f5ea38acf24f121fbb55f88181ecfebd2591a/fix-windows-printing.patch?at=default

残念ながら、ページ番号の部分がまだ文字化けしています。
printing

@k-takata

This comment has been minimized.

Show comment
Hide comment
@k-takata

k-takata Jun 8, 2013

Member

残念ながら、ページ番号の部分がまだ文字化けしています。

hardcopy.c の prt_header() の中の以下の部分で、tbuf には cp932 で書き込まれているようなのですが、そういうものなのでしょうか?

    sprintf((char *)tbuf, _("Page %d"), pagenum);
Member

k-takata commented Jun 8, 2013

残念ながら、ページ番号の部分がまだ文字化けしています。

hardcopy.c の prt_header() の中の以下の部分で、tbuf には cp932 で書き込まれているようなのですが、そういうものなのでしょうか?

    sprintf((char *)tbuf, _("Page %d"), pagenum);
@mattn

This comment has been minimized.

Show comment
Hide comment
@mattn

mattn Jun 9, 2013

Member

他言語したいがためにgettextした結果のsjisなんじゃないすかね。encじゃないのでちょっと考えないといけないですね

On 6/9/13, K.Takata notifications@github.com wrote:

残念ながら、ページ番号の部分がまだ文字化けしています。

hardcopy.c の prt_header() の中の以下の部分で、tbuf には cp932
で書き込まれているようなのですが、そういうものなのでしょうか?

  sprintf((char *)tbuf, _("Page %d"), pagenum);

Reply to this email directly or view it on GitHub:
#408 (comment)

  • Yasuhiro Matsumoto
Member

mattn commented Jun 9, 2013

他言語したいがためにgettextした結果のsjisなんじゃないすかね。encじゃないのでちょっと考えないといけないですね

On 6/9/13, K.Takata notifications@github.com wrote:

残念ながら、ページ番号の部分がまだ文字化けしています。

hardcopy.c の prt_header() の中の以下の部分で、tbuf には cp932
で書き込まれているようなのですが、そういうものなのでしょうか?

  sprintf((char *)tbuf, _("Page %d"), pagenum);

Reply to this email directly or view it on GitHub:
#408 (comment)

  • Yasuhiro Matsumoto
@k-takata

This comment has been minimized.

Show comment
Hide comment
@k-takata

k-takata Jun 9, 2013

Member

gettextからは、encで指定した文字コードで返ってくるのかと思っていたのですが、違うんですね。
gettextから返ってきたものをどのようにencに変換しているのでしょうか。

Member

k-takata commented Jun 9, 2013

gettextからは、encで指定した文字コードで返ってくるのかと思っていたのですが、違うんですね。
gettextから返ってきたものをどのようにencに変換しているのでしょうか。

@koron

This comment has been minimized.

Show comment
Hide comment
@koron

koron Jun 9, 2013

Member

gettextに対してenc指定してた気がする。
出先なのでソース確認できないけど。

Member

koron commented Jun 9, 2013

gettextに対してenc指定してた気がする。
出先なのでソース確認できないけど。

@koron

This comment has been minimized.

Show comment
Hide comment
@koron

koron Jun 9, 2013

Member

gettextからは、encで指定した文字コードで返ってくるのかと思っていた

普通は enc で指定したもので返ってくるのを確認しました。
mbyte.c の mb_init で bind_textdomain_codeset を読んでます。

Member

koron commented Jun 9, 2013

gettextからは、encで指定した文字コードで返ってくるのかと思っていた

普通は enc で指定したもので返ってくるのを確認しました。
mbyte.c の mb_init で bind_textdomain_codeset を読んでます。

@k-takata

This comment has been minimized.

Show comment
Hide comment
@k-takata

k-takata Jun 9, 2013

Member

すみません。間違っていました。gettextではなく、prt_header()の中の以下の部分で「ページ」の部分が出力されていました。

    build_stl_str_hl(curwin, tbuf, (size_t)(width + IOSIZE),
                          p_header, use_sandbox,
                          ' ', width, NULL, NULL);

ここで使っている、p_headerの中身が cp932 で以下のようになっていました。

%<%f%h%m%=%N ページ
Member

k-takata commented Jun 9, 2013

すみません。間違っていました。gettextではなく、prt_header()の中の以下の部分で「ページ」の部分が出力されていました。

    build_stl_str_hl(curwin, tbuf, (size_t)(width + IOSIZE),
                          p_header, use_sandbox,
                          ' ', width, NULL, NULL);

ここで使っている、p_headerの中身が cp932 で以下のようになっていました。

%<%f%h%m%=%N ページ
@k-takata

This comment has been minimized.

Show comment
Hide comment
@k-takata

k-takata Jun 9, 2013

Member

option.c に以下の部分がありました。

#ifdef FEAT_PRINTER
                (char_u *)&p_header, PV_NONE,
                {(char_u *)N_("%<%f%h%m%=Page %N"), (char_u *)0L}
#else

起動時に enc=cp932 の状態でデフォルト値が設定され、その後 enc=utf-8 に変更しても p_header の中身は cp932 のままになっているということでしょうか。

Member

k-takata commented Jun 9, 2013

option.c に以下の部分がありました。

#ifdef FEAT_PRINTER
                (char_u *)&p_header, PV_NONE,
                {(char_u *)N_("%<%f%h%m%=Page %N"), (char_u *)0L}
#else

起動時に enc=cp932 の状態でデフォルト値が設定され、その後 enc=utf-8 に変更しても p_header の中身は cp932 のままになっているということでしょうか。

@mattn

This comment has been minimized.

Show comment
Hide comment
@mattn

mattn Jun 9, 2013

Member

コード見れないけど、推測の通りだと思います。

On 6/9/13, K.Takata notifications@github.com wrote:

option.c に以下の部分がありました。

#ifdef FEAT_PRINTER
              (char_u *)&p_header, PV_NONE,
              {(char_u *)N_("%<%f%h%m%=Page %N"), (char_u *)0L}
#else

起動時に enc=cp932 の状態でデフォルト値が設定され、その後 enc=utf-8 に変更しても p_header の中身は cp932
のままになっているということでしょうか。


Reply to this email directly or view it on GitHub:
#408 (comment)

  • Yasuhiro Matsumoto
Member

mattn commented Jun 9, 2013

コード見れないけど、推測の通りだと思います。

On 6/9/13, K.Takata notifications@github.com wrote:

option.c に以下の部分がありました。

#ifdef FEAT_PRINTER
              (char_u *)&p_header, PV_NONE,
              {(char_u *)N_("%<%f%h%m%=Page %N"), (char_u *)0L}
#else

起動時に enc=cp932 の状態でデフォルト値が設定され、その後 enc=utf-8 に変更しても p_header の中身は cp932
のままになっているということでしょうか。


Reply to this email directly or view it on GitHub:
#408 (comment)

  • Yasuhiro Matsumoto
@k-takata

This comment has been minimized.

Show comment
Hide comment
@k-takata

k-takata Jun 9, 2013

Member

enc=utf-8 になったあとで、手で :set printheader=%<%f%h%m%=%N\ ページ の設定をしたところ、「ページ」の文字化けは解消されました。
原因は前述の通りとして、問題はどうやって直すか(あるいは直さないか)ですね。

Member

k-takata commented Jun 9, 2013

enc=utf-8 になったあとで、手で :set printheader=%<%f%h%m%=%N\ ページ の設定をしたところ、「ページ」の文字化けは解消されました。
原因は前述の通りとして、問題はどうやって直すか(あるいは直さないか)ですね。

@mattn

This comment has been minimized.

Show comment
Hide comment
@mattn

mattn Jun 9, 2013

Member
  1. なんとかして=Pageを抜き取って_()入れ換える
  2. 日本語だけ諦めて.poから消す

勿論1の場合、optionの_()は消す

Bram的には1が好みだと思う。

On 6/9/13, K.Takata notifications@github.com wrote:

enc=utf-8 になったあとで、手で :set printheader=%<%f%h%m%=%N\ ページ
の設定をしたところ、「ページ」の文字化けは解消されました。
原因は前述の通りとして、問題はどうやって直すか(あるいは直さないか)ですね。


Reply to this email directly or view it on GitHub:
#408 (comment)

  • Yasuhiro Matsumoto
Member

mattn commented Jun 9, 2013

  1. なんとかして=Pageを抜き取って_()入れ換える
  2. 日本語だけ諦めて.poから消す

勿論1の場合、optionの_()は消す

Bram的には1が好みだと思う。

On 6/9/13, K.Takata notifications@github.com wrote:

enc=utf-8 になったあとで、手で :set printheader=%<%f%h%m%=%N\ ページ
の設定をしたところ、「ページ」の文字化けは解消されました。
原因は前述の通りとして、問題はどうやって直すか(あるいは直さないか)ですね。


Reply to this email directly or view it on GitHub:
#408 (comment)

  • Yasuhiro Matsumoto
@mattn

This comment has been minimized.

Show comment
Hide comment
@mattn

mattn Jun 9, 2013

Member

あ、設定値全体がpoに入ってるのか。まぁBramの好みは1すな。
印刷前に変換した値で処理する、みたいな。

On 6/10/13, Yasuhiro MATSUMOTO mattn.jp@gmail.com wrote:

  1. なんとかして=Pageを抜き取って_()入れ換える
  2. 日本語だけ諦めて.poから消す

勿論1の場合、optionの_()は消す

Bram的には1が好みだと思う。

On 6/9/13, K.Takata notifications@github.com wrote:

enc=utf-8 になったあとで、手で :set printheader=%<%f%h%m%=%N\ ページ
の設定をしたところ、「ページ」の文字化けは解消されました。
原因は前述の通りとして、問題はどうやって直すか(あるいは直さないか)ですね。


Reply to this email directly or view it on GitHub:
#408 (comment)

  • Yasuhiro Matsumoto

  • Yasuhiro Matsumoto
Member

mattn commented Jun 9, 2013

あ、設定値全体がpoに入ってるのか。まぁBramの好みは1すな。
印刷前に変換した値で処理する、みたいな。

On 6/10/13, Yasuhiro MATSUMOTO mattn.jp@gmail.com wrote:

  1. なんとかして=Pageを抜き取って_()入れ換える
  2. 日本語だけ諦めて.poから消す

勿論1の場合、optionの_()は消す

Bram的には1が好みだと思う。

On 6/9/13, K.Takata notifications@github.com wrote:

enc=utf-8 になったあとで、手で :set printheader=%<%f%h%m%=%N\ ページ
の設定をしたところ、「ページ」の文字化けは解消されました。
原因は前述の通りとして、問題はどうやって直すか(あるいは直さないか)ですね。


Reply to this email directly or view it on GitHub:
#408 (comment)

  • Yasuhiro Matsumoto

  • Yasuhiro Matsumoto
@koron

This comment has been minimized.

Show comment
Hide comment
@koron

koron Jun 9, 2013

Member

enc変わった時に再設定とかできないの?

Member

koron commented Jun 9, 2013

enc変わった時に再設定とかできないの?

@mattn

This comment has been minimized.

Show comment
Hide comment
@mattn

mattn Jun 10, 2013

Member

それでもいいけど

Member

mattn commented Jun 10, 2013

それでもいいけど

@ghost ghost assigned k-takata Jun 10, 2013

@k-takata

This comment has been minimized.

Show comment
Hide comment
@k-takata

k-takata Jun 11, 2013

Member

enc変わった時に再設定とかできないの?

この流れ、どこかで見たような… #229 の 1. の案ですね。

Member

k-takata commented Jun 11, 2013

enc変わった時に再設定とかできないの?

この流れ、どこかで見たような… #229 の 1. の案ですね。

@k-takata

This comment has been minimized.

Show comment
Hide comment
@k-takata

k-takata Jun 12, 2013

Member

長い行の折り返しが正常動作していませんでした。
enc_to_utf16() で wlen しか変換していなかったため、if (wp[wlen] == NUL) の判定が必ず真になっていました。

修正後: https://bitbucket.org/k_takata/vim-win32-mq/src/d6a46312165b/fix-windows-printing.patch

Member

k-takata commented Jun 12, 2013

長い行の折り返しが正常動作していませんでした。
enc_to_utf16() で wlen しか変換していなかったため、if (wp[wlen] == NUL) の判定が必ず真になっていました。

修正後: https://bitbucket.org/k_takata/vim-win32-mq/src/d6a46312165b/fix-windows-printing.patch

@k-takata

This comment has been minimized.

Show comment
Hide comment
@k-takata

k-takata Jun 12, 2013

Member

2回目の enc_to_utf16() の呼び出し部分をもうちょっと効率化したいが、何バイト変換すればいいんだろう。

Member

k-takata commented Jun 12, 2013

2回目の enc_to_utf16() の呼び出し部分をもうちょっと効率化したいが、何バイト変換すればいいんだろう。

@k-takata

This comment has been minimized.

Show comment
Hide comment
@k-takata

k-takata Jun 13, 2013

Member

こうしておけば良さそう。

--- a/src/os_mswin.c
+++ b/src/os_mswin.c
@@ -1651,7 +1651,8 @@
    /* This is wrong when printing spaces for a TAB. */
    if (p[len] != NUL)
    {
-       wp = enc_to_utf16(p + len, NULL);
+       wlen = MB_PTR2LEN(p + len);
+       wp = enc_to_utf16(p + len, &wlen);
        if (wp != NULL)
        {
        GetTextExtentPoint32W(prt_dlg.hDC, wp, 1, &sz);
Member

k-takata commented Jun 13, 2013

こうしておけば良さそう。

--- a/src/os_mswin.c
+++ b/src/os_mswin.c
@@ -1651,7 +1651,8 @@
    /* This is wrong when printing spaces for a TAB. */
    if (p[len] != NUL)
    {
-       wp = enc_to_utf16(p + len, NULL);
+       wlen = MB_PTR2LEN(p + len);
+       wp = enc_to_utf16(p + len, &wlen);
        if (wp != NULL)
        {
        GetTextExtentPoint32W(prt_dlg.hDC, wp, 1, &sz);
@k-takata

This comment has been minimized.

Show comment
Hide comment
@k-takata

This comment has been minimized.

Show comment
Hide comment
@k-takata

k-takata Jun 13, 2013

Member

印刷の進捗ダイアログボックスが文字化けしてます。
vim-print-dlg
どこで表示しているんだろう?

Member

k-takata commented Jun 13, 2013

印刷の進捗ダイアログボックスが文字化けしてます。
vim-print-dlg
どこで表示しているんだろう?

@mattn

This comment has been minimized.

Show comment
Hide comment
@mattn

mattn Jun 13, 2013

Member

PrintDlgProc

Member

mattn commented Jun 13, 2013

PrintDlgProc

@k-takata

This comment has been minimized.

Show comment
Hide comment
@k-takata

k-takata Jun 13, 2013

Member

なるほど、SetDlgItemText() を使ってますね。
mch_print_begin(), mch_print_begin_page() もですね。

Member

k-takata commented Jun 13, 2013

なるほど、SetDlgItemText() を使ってますね。
mch_print_begin(), mch_print_begin_page() もですね。

@k-takata

This comment has been minimized.

Show comment
Hide comment
@k-takata

k-takata Jun 14, 2013

Member

修正しました。
https://bitbucket.org/k_takata/vim-win32-mq/src/35ada6bf25dc/fix-windows-printing.patch
テキストボックスの高さが足りず、文字が切れていたので、それも修正。

Member

k-takata commented Jun 14, 2013

修正しました。
https://bitbucket.org/k_takata/vim-win32-mq/src/35ada6bf25dc/fix-windows-printing.patch
テキストボックスの高さが足りず、文字が切れていたので、それも修正。

@k-takata

This comment has been minimized.

Show comment
Hide comment
@k-takata

k-takata Jun 16, 2013

Member

'printheader'の問題は解決していませんが、投げてしまいました。
https://groups.google.com/d/topic/vim_dev/15M80NgirgY/discussion

Member

k-takata commented Jun 16, 2013

'printheader'の問題は解決していませんが、投げてしまいました。
https://groups.google.com/d/topic/vim_dev/15M80NgirgY/discussion

@k-takata

This comment has been minimized.

Show comment
Hide comment
Member

k-takata commented Jun 16, 2013

@k-takata

This comment has been minimized.

Show comment
Hide comment
@k-takata

k-takata Jun 16, 2013

Member

さて、あとは'printheader'をどうするかですが…当面は必要な人が自分で .vimrc で設定するということで一旦閉じたいと思います。
続きは #229 か、新 issue で。

Member

k-takata commented Jun 16, 2013

さて、あとは'printheader'をどうするかですが…当面は必要な人が自分で .vimrc で設定するということで一旦閉じたいと思います。
続きは #229 か、新 issue で。

@k-takata k-takata closed this Jun 16, 2013

@h-east

This comment has been minimized.

Show comment
Hide comment
@h-east

h-east Jun 16, 2013

Member

@k-takata Gooood Job 👍

Member

h-east commented Jun 16, 2013

@k-takata Gooood Job 👍

@koron

This comment has been minimized.

Show comment
Hide comment
@koron

koron Jun 16, 2013

Member

@k-takata🍭

Member

koron commented Jun 16, 2013

@k-takata🍭

@mattn

This comment has been minimized.

Show comment
Hide comment
@mattn

mattn Aug 26, 2017

Member

printheader の翻訳を無効にする

vim/vim#2026

Member

mattn commented Aug 26, 2017

printheader の翻訳を無効にする

vim/vim#2026

@mattn mattn closed this Aug 27, 2017

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment