■93938 / inTopicNo.2) |
Re[1]: Editボックスに簡体字をセットする方法 |
□投稿者/ 魔界の仮面弁士 (2567回)-(2020/02/23(Sun) 15:13:59)
|
■No93935 (山猿 さん) に返信
> 赵治勋→?治?
Shift_JIS で扱える範囲の文字なら化けないので、
"趙治勳" もしくは
"趙治勲" で代用するか、もしくは
Unicode 版の API に切り替えるかの二択でしょう。
> 'utf-8文字
> Dim sb = New StringBuilder("", 256)
StringBuilder で保持されるデータは、UTF-8 ではなく UTF-16 ですね。
といっても、String や StringBuilder 自体には、Encoding という概念はないですけれど。
> SendMessageStr(hwnd, WM_SETTEXT, Len(sb.ToString), sb)
WM_SETTEXT メッセージの WPARAM は、文字列長を指定する場所ではないですよ?
> Declare Function SendMessageStr Lib "user32.dll" Alias "SendMessageA" (ByVal hWnd As Integer, ByVal MSG As Integer,
> ByVal wParam As Integer, ByVal lParam As System.Text.StringBuilder) As Integer
データ型がいろいろ間違っていますね…。下記だとどうですか?
Private Declare Auto Function SendMessageStr Lib "user32" Alias "SendMessage" (ByVal hWnd As IntPtr, ByVal Msg As Integer, ByVal wParam As IntPtr, ByVal lParam As StringBuilder) As IntPtr
> 適切な対処方法を
一番の問題は Alias 句。
Alias "〜〜A" は、ANSI バージョンの意味です。日本語環境なら Shift_JIS 専用になります。
Alias "〜〜W" の Wide バージョン(Unicode 版)を呼び出すようにしましょう。
歴史的な事情から、インターネット上に古くからあるサンプルは、〜A 系主体のコードで溢れていますが、
Win9x 系の OS が駆逐された現在において、〜〜A 系 API を呼び出すメリットは皆無といえます。
この API に限らず、基本的には 〜〜W 系を呼び出すことが望ましいです。下記も参照してみてください。
http://www5b.biglobe.ne.jp/~yone-ken/VBNET/Reference/ref2_GetPrivateProfileString.html
http://www5b.biglobe.ne.jp/~yone-ken/VBNET/special/sp06_GetPrivateProfileString.html
実験用サンプル
Imports System.Text
Public Class Form1
'ANSI / Wide それぞれのいろいろな宣言例
Private Const WM_SETTEXT As Integer = &HC
'Private Declare Ansi Function SendMessageA Lib "user32" (ByVal hWnd As IntPtr, ByVal Msg As Integer, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As IntPtr
'Private Declare Unicode Function SendMessageW Lib "user32" (ByVal hWnd As IntPtr, ByVal Msg As Integer, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As IntPtr
'Private Declare Auto Function SendMessageStr Lib "user32" Alias "SendMessage" (ByVal hWnd As IntPtr, ByVal Msg As Integer, ByVal wParam As IntPtr, ByVal lParam As StringBuilder) As IntPtr
Private Declare Ansi Function SendMessageA Lib "user32" (ByVal hWnd As IntPtr, ByVal Msg As Integer, ByVal wParam As IntPtr, ByVal lParam As StringBuilder) As IntPtr
Private Declare Unicode Function SendMessageW Lib "user32" (ByVal hWnd As IntPtr, ByVal Msg As Integer, ByVal wParam As IntPtr, ByVal lParam As StringBuilder) As IntPtr
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
'掲示板投稿時の文字化けを避けるため、ChrW 表記にしています
'上から、英語、簡体字中国語、繁体字中国語、日本語、韓国語
Dim values() As String = {
"Cho Chikun",
ChrW(&H8D75) & ChrW(&H6CBB) & ChrW(&H52CB),
ChrW(&H8D99) & ChrW(&H6CBB) & ChrW(&H52F3),
ChrW(&H8D99) & ChrW(&H6CBB) & ChrW(&H52F2),
ChrW(&HC870) & ChrW(&HCE58) & ChrW(&HD6C8)
}
Dim boxes(,) As TextBox = {
{TextBox1, TextBox6},
{TextBox2, TextBox7},
{TextBox3, TextBox8},
{TextBox4, TextBox9},
{TextBox5, TextBox10}
}
'比較のため、A 系と W 系の両方を呼び比べています
For n = 0 To 4
Dim sb As New StringBuilder(values(n))
SendMessageW(boxes(n, 0).Handle, WM_SETTEXT, IntPtr.Zero, sb)
SendMessageA(boxes(n, 1).Handle, WM_SETTEXT, IntPtr.Zero, sb)
Next
End Sub
End Class
|
|