Utf8Converter: Difference between revisions

From NSIS Wiki
Jump to navigationJump to search
m (Created page with 'Where is begin of future page...')
 
No edit summary
Line 1: Line 1:
Where is begin of future page...
== Description ==
Utf8Converter is a header file (.nsh) that contains two functions to convert ANSI strings to UTF-8 and conversely.
 
== References ==
Logiclib and System.dll plug-in
 
The include file for this is Utf8Converter.nsh. It can be included with:
<highlight-nsis>
!include 'Utf8Converter.nsh'
</highlight-nsis>
 
=== Statements ===
<highlight-nsis>${AnsiToUtf8} $srcAnsiString $destUtf8String</highlight-nsis>
Convert from source ANSI string to UTF-8 string.
 
<highlight-nsis>${Utf8ToAnsi} $srcUtf8String $destAnsiString</highlight-nsis>
Convert from source UTF-8 string to ANSI string.
 
=== Utf8Converter.nsh file content ===
<highlight-nsis>
/**
*  Two macroses to convert ANSI text to UTF-8 and conversely.
*  This file is FREE FOR USE.
*
*  Written by Shurmialiou Vadzim at 04/2010
*  inshae@gmail.com
*/
!ifndef ___ANSITOUTF8_NSH___
!define ___ANSITOUTF8_NSH___
 
!include "LogicLib.nsh"
 
/**
* Convert ANSI text to UTF-8 text in the installer or uninstaller.
*
* Usage:
* StrCpy $0 "Belarussian text: Прывiтанне, Свет!"
* ${AnsiToUtf8} $0 $1
* DetailPrint "'$1' == 'Belarussian text: Прывiтанне, Свет!'"  ;UTF-8 text
*/
!define AnsiToUtf8 '!insertmacro AnsiToUtf8Macro'
!macro AnsiToUtf8Macro SOURCE_STRING OUTPUT_STRING
Push "${SOURCE_STRING}"
Push 0 ;ANSI  codepage
Push 65001 ;UTF-8 codepage
!insertmacro ConvertOverUnicode
Pop "${OUTPUT_STRING}"
!macroend
 
/**
* Convert UTF-8 text to ANSI text in the installer or uninstaller.
*
* Usage:
* StrCpy $0 "Belarussian text: Прывiтанне, Свет!"
* ${Utf8ToAnsi} $0 $1
* DetailPrint "'$1' == 'Belarussian text: Прывiтанне, Свет!'"  ;UTF-8 text
*/
!define Utf8ToAnsi '!insertmacro Utf8ToAnsiMacro'
!macro Utf8ToAnsiMacro SOURCE_STRING OUTPUT_STRING
Push "${SOURCE_STRING}"
Push 65001 ;ANSI  codepage
Push 0 ;UTF-8 codepage
!insertmacro ConvertOverUnicode
Pop "${OUTPUT_STRING}"
!macroend
 
!macro ConvertOverUnicode
 
Exch $0 ;Result codepage
Exch
Exch $1 ;Source codepage
Exch
Exch 2
Exch $2 ;Source text
Push $3 ;Result text
Push $4
Push $5 ;unicode text
Push $6
Push $7
Push $8
StrCpy $3 ""
;From ANSI to Unicode and then from unicode to UTF-8
${If} $2 != ""
;long bufSize = ::MultiByteToWideChar(CP_ACP, 0, cp1251str, -1, 0, 0);
System::Call /NOUNLOAD "kernel32::MultiByteToWideChar(i r1, i 0, t r2, i -1, i 0, i 0) i .r4"
${If} $4 > 0
IntOp $4 $4 * 2 ;2 bytes by one unicode-symbol
System::Alloc /NOUNLOAD $4
Pop $5
; ::MultiByteToWideChar(CP_ACP, 0, cp1251str, -1, unicodeStr, bufSize)
System::Call /NOUNLOAD "kernel32::MultiByteToWideChar(i r1, i 0, t r2, i -1, i r5, i r4) i .r6"
${If} $6 > 0
;bufSize = ::WideCharToMultiByte(CP_UTF8, 0, unicodeStr, -1, 0, 0, 0, 0);
System::Call /NOUNLOAD "kernel32::WideCharToMultiByte(i r0, i 0, i r5, i -1, i 0, i 0, i 0, i 0) i .r6"
; ::WideCharToMultiByte(CP_UTF8, 0, unicodeStr, -1, utf8Str, bufSize, 0, 0)
System::Call /NOUNLOAD "kernel32::WideCharToMultiByte(i r0, i 0, i r5, i -1, t .r7, i r6, i 0, i 0) i .r8"
 
${If} $8 > 0
;Save result to $3
StrCpy $3 $7
${EndIf}
${EndIf}
;Free buffer from unicode string
System::Free $5
${EndIf}
${EndIf}
 
Pop  $8
Pop  $7
Pop  $6
Pop  $5
Pop  $4
Exch
Pop  $2
Exch
Pop  $1
Exch
Pop  $0
Exch  $3
 
!macroend
 
!endif ;___ANSITOUTF8_NSH___
</highlight-nsis>
 
[[Category:Strings]]
[[Category:Utf8Converter]]

Revision as of 18:43, 8 April 2010

Description

Utf8Converter is a header file (.nsh) that contains two functions to convert ANSI strings to UTF-8 and conversely.

References

Logiclib and System.dll plug-in

The include file for this is Utf8Converter.nsh. It can be included with:

!include 'Utf8Converter.nsh'

Statements

${AnsiToUtf8} $srcAnsiString $destUtf8String

Convert from source ANSI string to UTF-8 string.

${Utf8ToAnsi} $srcUtf8String $destAnsiString

Convert from source UTF-8 string to ANSI string.

Utf8Converter.nsh file content

/**
 *  Two macroses to convert ANSI text to UTF-8 and conversely.
 *  This file is FREE FOR USE.
 *
 *  Written by Shurmialiou Vadzim at 04/2010
 *  inshae@gmail.com
 */
 
!ifndef ___ANSITOUTF8_NSH___
!define ___ANSITOUTF8_NSH___
 
!include "LogicLib.nsh"
 
/**
 * Convert ANSI text to UTF-8 text in the installer or uninstaller.
 *
 * Usage:
 * StrCpy $0 "Belarussian text: Прывiтанне, Свет!"
 * ${AnsiToUtf8} $0 $1
 * DetailPrint "'$1' == 'Belarussian text: Прывiтанне, Свет!'"   ;UTF-8 text
 */
!define AnsiToUtf8 '!insertmacro AnsiToUtf8Macro'
!macro AnsiToUtf8Macro SOURCE_STRING OUTPUT_STRING
	Push "${SOURCE_STRING}"
	Push 0		;ANSI  codepage
	Push 65001	;UTF-8 codepage
	!insertmacro ConvertOverUnicode
	Pop "${OUTPUT_STRING}"
!macroend
 
/**
 * Convert UTF-8 text to ANSI text in the installer or uninstaller.
 *
 * Usage:
 * StrCpy $0 "Belarussian text: Прывiтанне, Свет!"
 * ${Utf8ToAnsi} $0 $1
 * DetailPrint "'$1' == 'Belarussian text: Прывiтанне, Свет!'"   ;UTF-8 text
 */
!define Utf8ToAnsi '!insertmacro Utf8ToAnsiMacro'
!macro Utf8ToAnsiMacro SOURCE_STRING OUTPUT_STRING
	Push "${SOURCE_STRING}"
	Push 65001	;ANSI  codepage
	Push 0		;UTF-8 codepage
	!insertmacro ConvertOverUnicode
	Pop "${OUTPUT_STRING}"
!macroend
 
!macro ConvertOverUnicode
 
	Exch $0	;Result codepage
	Exch
	Exch $1	;Source codepage
	Exch
	Exch 2
	Exch $2	;Source text
 
	Push $3	;Result text
	Push $4
	Push $5	;unicode text
	Push $6
	Push $7
	Push $8
 
	StrCpy $3 ""
 
	;From ANSI to Unicode and then from unicode to UTF-8
 
	${If} $2 != ""
 
		;long bufSize = ::MultiByteToWideChar(CP_ACP, 0, cp1251str, -1, 0, 0);
		System::Call /NOUNLOAD "kernel32::MultiByteToWideChar(i r1, i 0, t r2, i -1, i 0, i 0) i .r4"
 
		${If} $4 > 0
 
			IntOp $4 $4 * 2	;2 bytes by one unicode-symbol
			System::Alloc /NOUNLOAD $4
			Pop $5
 
			; ::MultiByteToWideChar(CP_ACP, 0, cp1251str, -1, unicodeStr, bufSize)
			System::Call /NOUNLOAD "kernel32::MultiByteToWideChar(i r1, i 0, t r2, i -1, i r5, i r4) i .r6"
			${If} $6 > 0
 
				;bufSize = ::WideCharToMultiByte(CP_UTF8, 0, unicodeStr, -1, 0, 0, 0, 0);
				System::Call /NOUNLOAD "kernel32::WideCharToMultiByte(i r0, i 0, i r5, i -1, i 0, i 0, i 0, i 0) i .r6"
 
				; ::WideCharToMultiByte(CP_UTF8, 0, unicodeStr, -1, utf8Str, bufSize, 0, 0)
				System::Call /NOUNLOAD "kernel32::WideCharToMultiByte(i r0, i 0, i r5, i -1, t .r7, i r6, i 0, i 0) i .r8"
 
				${If} $8 > 0
					;Save result to $3
					StrCpy $3 $7
				${EndIf}
 
			${EndIf}
 
			;Free buffer from unicode string
			System::Free $5
 
		${EndIf}
 
	${EndIf}
 
	Pop  $8
	Pop  $7
	Pop  $6
	Pop  $5
	Pop  $4
	Exch
	Pop  $2
	Exch
	Pop  $1
	Exch
	Pop  $0
	Exch  $3
 
!macroend
 
!endif	;___ANSITOUTF8_NSH___