es por los unicode...
Visual Basic se basa internamente en el estándar Unicode de doble byte. Sin embargo, fuera del mundo de Visual Basic, se sigue utilizando el modelo ANSI de un bit. Por esta razón, Visual Basic proporciona dos conjuntos de controles de formularios y utiliza los conjuntos ANSI como control predeterminado. Cualquier cadena que se pase al conjunto ANSI de controles de formularios se convierte de su representación Unicode interna a su representación ANSI y las cadenas UNICODE no se mostrarán correctamente. Para poder mostrar la cadena UNICODE en un formulario de Visual Basic, deben utilizarse los controles UNICODE (Forms 2.0). En el ejemplo siguiente se ilustra cómo utilizar los controles de Forms 2.0 para mostrar cadenas UNICODE obtenidas de un archivo de texto Unicode. Puesto que se necesita el paquete de compatibilidad de idioma UNICODE, actualmente este sistema sólo se aplica a Windows NT.
si buscas en internet unicode + visual basic , vas a encontrar toneladas de paginas que hablan del tema, miles de ejemplos hay, controles personalizados, etc...
fijate que en windows hay fuentes que tienen charset de diferentes idiomas, cuando seleccionas la fuente fijate hay un combo abajo de todo que podes cambiar el idioma de la fuente, con eso y poniendo los codigos de los caracteres correctos, te los va a mostrar bien.busca en internet las tablas de los caracteres para los paises, ahi te dcie el codigo que tiene cada letra china, rusa, arabe lo que sea...para despues hacerle el
ChrW()...aca te paso un ejemplo...no es el mejor, pero para que veas como es te sirve seguro. pone un control Richtextbox1 en el form y este codigo.
Option Explicit
Private Const CP_UNICODE = 1200
Private Const WM_USER = &H400&
Private Const EM_SETTEXTEX = WM_USER + 97
Private Declare Function SendMessageWLng Lib "user32" Alias "SendMessageW" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Enum RTBW_FLAGS
RTBW_DEFAULT = 0
RTBW_KEEPUNDO = 1
RTBW_SELECTION = 2
End Enum
Private Type SETTEXTEX
flags As RTBW_FLAGS
codepage As Long
End Type
Private Sub Form_Load()
Dim vIngles As String
vIngles = ChrW(&H57) & ChrW(&H65) & ChrW(&H6C) & ChrW(&H63) & ChrW(&H6F) & ChrW(&H6D) & ChrW(&H65) & _
ChrW(&H20) & ChrW(&H74) & ChrW(&H6F) & ChrW(&H20) & _
"Unicode" & ChrW(&H21)
Dim vAleman As String
vAleman = ChrW(&H42) & ChrW(&H69) & ChrW(&H65) & _
ChrW(&H6E) & ChrW(&H76) & ChrW(&H65) & ChrW(&H6E) & _
ChrW(&H75) & ChrW(&H65) & ChrW(&H20) & ChrW(&H61) & _
ChrW(&H75) & ChrW(&H20) & "Unicode" & ChrW(&H21)
Dim vJapones As String
vJapones = "Unicode " & ChrW(&H3078) & _
ChrW(&H3087) & ChrW(&H3045) & ChrW(&H3053) & _
ChrW(&H305D) & ChrW(&H21)
Dim vPortugues As String
vPortugues = ChrW(&H53) & ChrW(&HE9) & ChrW(&H6A) & _
ChrW(&H61) & ChrW(&H20) & ChrW(&H42) & _
ChrW(&H65) & ChrW(&H6D) & ChrW(&H76) & _
ChrW(&H69) & ChrW(&H6E) & ChrW(&H64) & _
ChrW(&H6F) & ChrW(&H20) & "Unicode" & ChrW(&H21)
Dim vRusia As String
vRusia = ChrW(&H414) & ChrW(&H43E) & ChrW(&H431) & _
ChrW(&H440) & ChrW(&H43E) & ChrW(&H20) & _
ChrW(&H43F) & ChrW(&H43E) & ChrW(&H436) & _
ChrW(&H430) & ChrW(&H43B) & ChrW(&H43E) & _
ChrW(&H432) & ChrW(&H430) & ChrW(&H442) & _
ChrW(&H44A) & ChrW(&H20) & ChrW(&H432) & _
ChrW(&H20) & "Unicode" & ChrW(&H21)
Dim vEspañol As String
vEspañol = ChrW(&H42) & ChrW(&H69) & ChrW(&H65) & _
ChrW(&H6E) & ChrW(&H76) & ChrW(&H65) & _
ChrW(&H6E) & ChrW(&H69) & ChrW(&H64) & _
ChrW(&H61) & ChrW(&H20) & ChrW(&H61) & _
ChrW(&H20) & "Unicode" & ChrW(&H21)
Dim vChino As String
vChino = ChrW(&H6B22) & ChrW(&H8FCE) & _
ChrW(&H4F7F) & ChrW(&H7528) & ChrW(&H20) & _
"Unicode" & ChrW(&H21)
Call Unicode(vIngles & vbNewLine & vAleman & vbNewLine & vJapones & vbNewLine & vPortugues & vbNewLine & vRusia & vbNewLine & vEspañol & vbNewLine & vChino)
End Sub
Private Sub Unicode(ByRef pTexto As String)
Dim stUnicode As SETTEXTEX
With stUnicode
.flags = RTBW_DEFAULT
.codepage = CP_UNICODE
End With
Call SendMessageWLng(Richtextbox1.hWnd, EM_SETTEXTEX, VarPtr(stUnicode), StrPtr(pTexto))
End Sub
saludos.