NSIS拡張DLLは、一般的なプログラミング構文構造をサポートしています
#include <WINDOWS.H> する#include <stdio.hに> の#define FORCE_SWITCH "/ FORCE" の#define NOSAFE_SWITCH "/ NOSAFE" の#define MAX_STRLEN 1024 / * NSISスタック構造体* / typedefは構造体_stack_t { 構造体 _stack_t * 次回。 チャー テキスト[MAX_STRLEN]。 } stack_t。 stack_t ** g_stacktop。 char * g_variables。 符号なし整数 g_stringsize。 HINSTANCE g_hInstance; #define EXDLL_INIT()\ {\ g_stacktop = stacktop。\ g_variablesの =の変数; \ g_stringsize = string_size。\ } // 機能:NSISスタックの先頭から要素を削除し、バッファにそれを置く のint(popstring のchar *のSTR) { stack_t * 番目。 もし(!!g_stacktop || * g_stacktop)リターン 1 。 第 =(* g_stacktop)。 lstrcpy(STR、番目 - > テキスト); * g_stacktop = TH->次; GlobalFree((HGLOBAL)番目)。 リターン 0 ; } // 関数:NSISスタックの一番上に要素を追加 ボイド pushstring(CONST のchar *のSTR) { stack_t * 番目。 もし(!g_stacktop)リターン。 第 =(stack_t *)のGlobalAlloc(GPTR、はsizeof(stack_t)+ g_stringsize)。 lstrcpyn(第 - > テキスト、STR、g_stringsize)。 目 - >次= * g_stacktop。 * = g_stacktop 番目。 } のボイド__declspec(DLLEXPORT)を復号(HWND hwndParent、INT string_size、 CHAR *変数、stack_t ** stacktop) { チャー string_to_decode [MAX_STRLEN] = "" ; charが string_decoded [MAX_STRLEN] = "" ; チャーの 長さ[ 16 ] = "" ; EXDLL_INIT(); { popstring(string_to_decode)。 popstring(長さ)。 pushstring(string_decoded)。 } } BOOL WINAPIのDllMain(HANDLE hInst、ULONG ul_reason_for_call、LPVOID lpReserved) { g_hInstance = hInst。 返すTRUE; }
コンピュータwin10ので、NSISは、UNICODE形式を使用して符号化され、NSIS提供上記の例では、plugin-common.h
ある使用char
ではなく、wchar_t
(文字受信のみインポートするために渡されたDLLのパラメータが得られ、長い時間のためFUCK調査を古い同僚の助けのおかげで)
ソリューション:
- プラグインコードが
char
変更しましたwchar_t
。 - NSIスクリプトを追加しました
Unicode True
。(あなたはユニコードを使用したいのですが、スクリプトは、マルチバイトを使用している場合) - あなたはNSISの下にDLLディレクトリにプラグを生成する必要が
Plugins\x86-unicode
サブディレクトリ。(スクリプトは、Unicodeを使用している場合、このサブディレクトリは、場合によっては、存在しないかもしれません)
ANSI:我々は、キーボード上のシンボルを見ることができ、符号化範囲は32から126であることを特徴とするコンピュータのみ(、十分な文字を文字セット、(制御シンボルを含む)256個のシンボルケース文字をASCIIコードを表すことができる初めて数字、記号など)。しかし、彼は漢字を述べ、日本、韓国は、十分にかなり良いではない、一般的な単語を使用し、3,000人以上の漢字があります。
しかし、中国の人々は、コンピュータのタイピングを使用する必要がありますので、中国の人々は、この間隔は転用255に最初の中国の文字セットGB2312(GBKは後の拡張である)、GB2312の練習、128の範囲内のASCコードを思い付きます2つのASCコードが文字を示すと、そのような表現は十分に、より1万シンボルを表現することができるであろう16進数では0xFFFFまでの範囲0x8080を、コーディング入手可能である、見えます。[注:実際のあまり役に立たない、GBK範囲は8140-FEFEです]
その際、コンピュータ技術を開発している、など台湾など、自分の国、に従事、またBIG5と呼ばれる別のセット、(通称:ビッグ-5)に従事し、本土との両方、同じではないですが、方法が似ています0xFFに0x80をこの間隔です。
そして、日本(JISをコードする)、韓国語などにもそれぞれ独自のことをやって。
これらの国々のセクションをコーディング重複しているが、同じ文字(など一部の文字などが同時に簡体字および繁体字、日本語、中国語の文字に存在する)異なるコードがあり、それが混乱していることはそうではありませんか?しかし、またして行うようにします。完全にあなたはそれがエンコードされているかわからない場合、あなたはそれが表示されているかを判断することは困難である、ウェブページなど、さまざまな原因のトラブルの多くをエンコードし、文字は中国本土/台湾繁体字中国語/日本語の文字を簡略化することができるが、異なる単語。非常に古いソフトウェアのいくつかは、あなたが日本語/中国語版などで聞いたことがあれば、対応するバージョンは、対応するシステム上でのみ動作します。
それは、言語の異なるバージョンが、再エンコードすることを意味するので、その後、オペレーティングシステムの開発は、非常に困難です。このように、本発明のUnicode。ユニコードこの事はすべてで、地球上のすべての記号言語がすべきことであるセット統一文字ユニークなコーディングを表現するために。
UTF-8
インターネットの普及は、統一されたコーディングが表示されます促しました。UTF-8は、インターネット上でUnicodeを使用して最も広く使用されている実装です。他の実装は、さらに、実質的にはないインターネット上で、UTF-16(文字2バイトまたは4バイト)、およびUTF-32(文字で表される4バイト)を含みます。繰り返しますが、ここで関係、UTF-8 Unicodeは、実装の一つです。
UTF-8の最大の特徴は、可変長符号化であるということです。これは、バイト長がシンボルによって異なり、一つのシンボルの1〜4バイトであることができます。
UTF-8エンコーディング規則は、2つだけの非常にシンプルです。
1)単一バイトシンボルに対して、バイト0のセット、Unicodeコード・シンボルの後ろ7。そのため、英語のアルファベットのため、UTF-8エンコーディングとASCIIコードは同じです。
2)シンボルnバイトを(N> 1)、最初のバイトの最初のnビットが1に設定され、N + 1ビットが0に設定され、後の最初の2つのバイトが均一セット10。残りのビットは、Unicodeコードシンボルの全てを言及していません。
ます。https://www.cnblogs.com/lizhanzhe/p/11019631.htmlで再現