Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

リソースファイルのエンコーディングを UTF-8 (BOM無し) に変更 #251

Merged
merged 5 commits into from
Jul 18, 2018

Conversation

kobake
Copy link
Member

@kobake kobake commented Jul 14, 2018

リソースファイルで SJIS 以外の文字列表現が扱えるように、ファイルエンコーディングを UTF-8 (BOM無し) に変更します。

※ BOM があるとリソースエディタで開けなくなるのであえて付けない。

対応内容

  • .rc のファイルエンコーディングを UTF-8 (BOM無し) に変更
  • .rc ファイルの先頭で#pragma code_page(65001) を宣言
  • .rc のビルドオプションとして /c 65001 を追加

関連 Issues

ソースコードのUnicode化 #112

NOTE

この PR は当初 UTF-16 で対応する方針で進めていましたが、途中から UTF-8 にする方針に変更されました。そのため、本 PR 前半のコメントは UTF-16 方針時に対するコメントとなっています。

Copy link
Member

@m-tmatma m-tmatma left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

github で差分が全く確認できなくなるので
逆に不便になると思います。

どの文字を使いたいか、具体的なものはありますか?

@m-tmatma
Copy link
Member

また英語のリソースに関しては、対応の必要がないのではないかと思いますが、どうでしょうか?

@kobake
Copy link
Member Author

kobake commented Jul 14, 2018

原因追ってる最中ではあるのですが、UTF-8 化されたヘッダを SJIS の .rc に読み込ませるとエラーになってしまうことがあり、それへの対策の意味が大きいです。

@kobake
Copy link
Member Author

kobake commented Jul 14, 2018

差分表示のうまい対策があれば良いのですが…

https://github.com/kobake/sakura/blob/master/.gitattributes こういう設定を試してみたりしていますが、まだうまくいってないです

@berryzplus
Copy link
Contributor

また英語のリソースに関しては、対応の必要がないのではないかと

英語リソースこそ対応が必要だと考えております。

現状: sakura_lang_en_US.dllのリソースファイルはShift-JIS(=日本語)で記述されている
将来: sakura_rc.rcにユニコードで記述した各国語リソースを用意したい

標準的な英語のコードページは ISO8859-15(cp1252) です。
サクラエディタの文字列リソースには日本語の記号が使われているので、
ローカライズ版にもあえてShift-JIS(cp932, Windows-31J)が選択されています。

sourceforge.net時代にもこの点は突っ込んだことがあります。
当時Shift-JIS以外のファイルを管理するのには抵抗がある、
ということだったので対応は見送られました。

エンコーディング混在もよしとする、
という方針になった今、変更を見送る理由が見つからないです。

というか、GitHubがコードページを正しく認識できない理由って、
Shift-JISにはBOMが付けられないから認識しづらいのが原因だと思っています。
多数派ではないのかも知れませんがBOMが付いていたらUTF16LEを認識してくれたりしないかな~という期待。

@kobake
Copy link
Member Author

kobake commented Jul 14, 2018

本 PR では UTF16LE BOM 付きにしてあるのですが、なかなかうまく認識してくれませんね……何か追加設定で認識してくれるようになると良いのですが……

@m-tmatma
Copy link
Member

そもそも、utf8 対応は github で文字化けして
差分が読めないことに対応するために導入しようと
したはずなので、utf 8 化することによって、リソースファイルの差分が確認できないのであれば、該当するファイルの utf8 はやらないようにすればいいと思います。

@berryzplus
Copy link
Contributor

ちょっと待って。
*.rcの文字コード変換したら少なくとも1箇所は絶対変更しないといけない記述があるはずです。

前にどっかで書きましたが、rc.exeにはドキュメントの途中で文字コードを変更する命令がありますので。

@kobake
Copy link
Member Author

kobake commented Jul 14, 2018

#pragma code_page(932) の行は消してます(すみません、この説明は書き忘れてました)。

@kobake
Copy link
Member Author

kobake commented Jul 14, 2018

反応見る限り、けっこう微妙なところですね。(自分でも微妙だな、とは思っていたのですが、何か良い改善案が出てくることを少し期待していましたが、今のところ無いですね)

.rc は ANSI のままにしておいて、仮に SJIS 以外の文字列を扱いたいことがあるときには .rc とは違う形式の外部テキストファイルを UTF-8 で作って、それを読み込ませるとかでも良いかな、とか思いました。

@kobake kobake changed the title リソースファイルのエンコーディングを UTF-16LE (BOM付) に変更 [WIP] リソースファイルのエンコーディングを UTF-16LE (BOM付) に変更 Jul 14, 2018
@kobake
Copy link
Member Author

kobake commented Jul 14, 2018

一旦 WIP に戻しておきます

@berryzplus
Copy link
Contributor

まったく認識しませんね。<UTF-16LE差分

https://github.com/berryzplus/sandbox/commit/8a89ed8382fd8454e0733914902736bf257ff509

こっちのsandboxで実験すればよかった、と後になって気づくなど。

kobakeさん

#pragma code_page(932) の行は消してます(すみません、この説明は書き忘れてました)。

消す、じゃなくてUTF16LEの CP_xxx を確認してそれを書かないといけないはず。
たしか 12000 だったような気がしないでもないですが、ちゃんと調べて。

@kobake
Copy link
Member Author

kobake commented Jul 14, 2018

コードポイント値は最初はUTF16のもの(確か1200)設定してみたのですが、その値は不正ですみたいなエラー出たので行そのものを削ってしまいました

@berryzplus
Copy link
Contributor

sshでGitHubにログインする、って出来るんですかね?
.git/config に設定しないとうまくいかなさそうな気がしてきました。

git config diff.utf16.textconv 'iconv -f utf-16 -t utf-8'

実験資材をこっちにも入れてみました。
sakura-editor/sandbox@4dcba24

ファイル単体だと中身を表示できるけど、差分表示が無理みたいですね。
表示上、BINって出てるのが気になるわけで・・・。

@k-takata
Copy link
Member

rc /c 65001 でコンパイルすれば UTF-8 でいけるような。
UTF-8のBOMを見てくれないのは残念ですが。

@m-tmatma
Copy link
Member

ヘルプには、/c オプション載ってますね。

https://docs.microsoft.com/en-us/windows/desktop/menurc/using-rc-the-rc-command-line-

@m-tmatma
Copy link
Member

@berryzplus
Copy link
Contributor

何が問題なのかよく分らなくなってきたので表にしてみます。

文字コード 良いこと 困ること
Shift-JIS 現状通りなので変更しなくていい GitHubで差分表示が化ける
UTF-8 GitHubで差分表示できる rc.exeが認識してくれない
UTF-16LE rc.exeでunicode扱うときの標準 GitHubで差分表示できない

メリットとデメリットで主体がズレてるので、よく分からない表になりました。
この表を主体(=軸)を揃えて分析しなおしてみます。

文字コード 差分表示(GitHub) リソースコンパイル(rc.exe)
Shift-JIS △(化ける) ○(現状通り)
UTF-8 ○(標準) △(オプション指定で対応可能)
UTF-16LE ×(BIN扱い) ○(標準)

う~む、これはつまり。

@kobake
Copy link
Member Author

kobake commented Jul 14, 2018

/c 等というものが……!情報ありがとうございます。
夜あたりに試してみたいと思います。

@m-tmatma
Copy link
Member

/c 等というものが……!情報ありがとうございます。

http://0mg.hatenadiary.jp/entry/2013/10/02/170502 によると以下とあります。

さらに、ソースコード中で指定する方法もある。すなわち #pragma code_page(65001) である。簡単。

@m-tmatma
Copy link
Member

↑ /c を使うよりも簡単な気がします。

@k-takata
Copy link
Member

さらに、ソースコード中で指定する方法もある。すなわち #pragma code_page(65001) である。簡単。

これ、Visual Studioで作ったリソースファイルだと、

#pragma code_page(932)

のようにファイルの途中に挿入されるのですが、これを 932 から 65001 に書き換えても、それより前の行でエラーが出ます。
あと、Visual Studioでちゃんと編集できるかは未確認です。

@berryzplus
Copy link
Contributor

これを 932 から 65001 に書き換えても、それより前の行でエラーが出ます。
あと、Visual Studioでちゃんと編集できるかは未確認です。

ありがとうございます。なんとか確認が取れました。

文字コード 差分表示(GitHub) リソースコンパイル(rc.exe) vs2017リソースエディタ
UTF-8(BOM付) × ×
UTF-8(BOM無) △(編集は可能)

UTF-8Nのrcを編集して保存するとShiftJISに戻る、という怪現象が起きます。

もともとリソースエディタを使わない人が主流でやってきたプロジェクトなので、いったんは差分表示ができることを優先してUTF-8Nに移行で良いのかな?と思っています。リソースエディタ使うとファイルが壊れるのは元からなので。

編集すべき箇所をチェックしてみました。

/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#define APSTUDIO_HIDDEN_SYMBOLS
#include <Windows.h>

ここ(19行目)に #pragma code_page(65001) を入れる。

2 TEXTINCLUDE DISCARDABLE
BEGIN
"#define APSTUDIO_HIDDEN_SYMBOLS\r\n"
"#include <Windows.h>\r\n"
"#undef APSTUDIO_HIDDEN_SYMBOLS\r\n"
"#include ""funccode_define.h""\r\n"

ここ(52行目)に 上の#pragma code_page(65001) の生成コードを入れる。
必須ではないです。

#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_JPN)
#ifdef _WIN32
LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT
#pragma code_page(932)
#endif //_WIN32

ここのparagmaとかifndef WIN32は不要。
編集して保存すると文字コードが変更され、
#pragma code_page(932) が復活します。

VALUE "Translation", 0x411, 1200

この 1200 はUTF16LEを意味するので65001に変える。

@berryzplus
Copy link
Contributor

ん?defineしたchar*定数を使うコードがいまの #pragma code_page(932) の前になければ移動しなくていいような気がしてきました・・・。

@k-takata
Copy link
Member

この 1200 はUTF16LEを意味するので65001に変える。

リソースファイルのコンパイル後はUTF-16LEで格納されるので、そのままでいい気がします。

@berryzplus
Copy link
Contributor

そのままでいい気がします。

おっしゃる通り、このパラメータが何に影響してるのか分かってませんでした。
1200のままで良さそうです。

@m-tmatma
Copy link
Member

そですね、編集で SJIS に戻ってしまう問題があることは意識した上で、一旦 BOM 無しのコミット積みます

a54b143 の状態で rc ファイルを Shift JIS で保存して
コンパイルすると、ビルドエラーになったので間違って Shift JIS で保存してコミットしてしまっても
appveyor でビルドエラーになるはずなので、気づけるとは思います。
(appveyor 上では確認してないです。ローカルビルドです)

@kobake
Copy link
Member Author

kobake commented Jul 18, 2018

@m-tmatma さん検証ありがとうございます。バイナリ一致してるの確認できると安心できますね。

@berryzplus
Copy link
Contributor

vcxprojの文字コード指定が保険として使える結果になったというw

せっかくなので開けるとこまで持って行ってしまいたい気がします。がどうでしょう。

数行書き替えで済みます。

@kobake
Copy link
Member Author

kobake commented Jul 18, 2018

6e42d7a で BOM 無しの .rc コミットしました。リソースエディタで開ける状態にはなったはずです。

Copy link
Member

@m-tmatma m-tmatma left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

BOM なし、というのもコメントにあったほうがいいと思います。リソースエディタで開けるようにするという理由もあったほうがいいと思います。

@m-tmatma
Copy link
Member

6e42d7a で BOM 無しの .rc コミットしました。リソースエディタで開ける状態にはなったはずです。

6e42d7a でも同様に res ファイルが完全一致しています。

@kobake
Copy link
Member Author

kobake commented Jul 18, 2018

BOM 無しコメント入れました

@berryzplus
Copy link
Contributor

電池やべっ!

変更1か所目

// CodePage: 65001 (UTF-8)
#pragma code_page(65001)

#include "sakura_rc.h"

#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#define APSTUDIO_HIDDEN_SYMBOLS
#include <Windows.h>
#undef APSTUDIO_HIDDEN_SYMBOLS
#include "Funccode_define.h"
#include "String_define.h"
#include "version.h"

変更2か所目

/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//

1 TEXTINCLUDE DISCARDABLE 
BEGIN
    "sakura_rc.h\0"
END

2 TEXTINCLUDE DISCARDABLE 
BEGIN
    "#define APSTUDIO_HIDDEN_SYMBOLS\r\n"
    "#include <Windows.h>\r\n"
    "#undef APSTUDIO_HIDDEN_SYMBOLS\r\n"
    "#include ""funccode_define.h""\r\n"
	"#include ""String_define.h""\r\n"
	"#include ""version.h""\r\n"
	"\0"
END

以上でリソースエディタでsakura_rc.rcを開けるようになりました。

@m-tmatma
Copy link
Member

BOM 無しコメント入れました

確認しました。

85917a6 + preBuild.bat での exit /b 0

  • バイナリ一致することも確認しました。
  • リソースエディタで開けることも確認しました。
  • rc ファイルを強制的に shift-Jis で保存して appveyor でコンパイルエラーになることを確認しました。

@m-tmatma
Copy link
Member

説明欄で BOM付 としているところを修正していただけますか?

@kobake kobake changed the title リソースファイルのエンコーディングを UTF-8 (BOM付) に変更 リソースファイルのエンコーディングを UTF-8 (BOM無し) に変更 Jul 18, 2018
@kobake
Copy link
Member Author

kobake commented Jul 18, 2018

PR タイトルと本文を修正しました

@m-tmatma
Copy link
Member

この PR はもともと UTF16 対応をするということで始まりましたが
途中で方針変更して UTF8 対応することになりました。
だから最初は UTF16 対応することに対するコメントがついています。

途中で方針変更して全く別のやり方で対応することになった場合
後で見返したときに経緯がわかるようにもともとの PR をマージせずに
クローズして、新たな PR を作るのがいい思います。

新しい PR の説明欄に古い PR のコメントを適宜引用して、経緯を説明する
ようにしたらいいと思います。

@m-tmatma m-tmatma added this to the next release milestone Jul 18, 2018
@m-tmatma m-tmatma added the refactoring リファクタリング 【ChangeLog除外】 label Jul 18, 2018
@kobake
Copy link
Member Author

kobake commented Jul 18, 2018

たしかに PR 作り直したほうが良かったかもしれませんね。
必ずしも PR 作り直すのが正解とは自分は思いませんが(特に議論が分散して情報を漁るのが面倒になる点が自分は好きではないです)、PR 作り直す選択肢があることは頭に入れておきます。

今回は PR 本文内に経緯のメモも追記しました。

Copy link
Contributor

@berryzplus berryzplus left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTMです。

@kobake kobake merged commit 29af81d into sakura-editor:master Jul 18, 2018
@kobake kobake deleted the rc-utf16 branch July 18, 2018 14:46
@ds14050 ds14050 added refactoring リファクタリング 【ChangeLog除外】 🌏Internationalization 🇯🇵 🇺🇸 🇨🇳 🇹🇼 国際化対応 labels Sep 18, 2018
HoppingTappy pushed a commit to HoppingTappy/sakura that referenced this pull request Jun 11, 2019
リソースファイルのエンコーディングを UTF-8 (BOM無し) に変更
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
🌏Internationalization 🇯🇵 🇺🇸 🇨🇳 🇹🇼 国際化対応 refactoring リファクタリング 【ChangeLog除外】
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants