<![CDATA[Latest posts for the topic "Unicode trong VC6"]]> /hvaonline/posts/list/23.html JForum - http://www.jforum.net Unicode trong VC6 /hvaonline/posts/list/1326.html#6195 /hvaonline/posts/list/1326.html#6195 GMT Unicode trong VC6 /hvaonline/posts/list/1326.html#6205 /hvaonline/posts/list/1326.html#6205 GMT Unicode trong VC6

Z0rr0 wrote:
Chào bạn, Để hiện thị đa ngôn ngữ trên ứng dụng người ta cần thực hiện 2 bước chính: - Hiển thị giao diện (GUI): bao gồm hiển thị menu, dialog, title, button, ..các control khác. - Xử lý và hiển thị dữ liệu Với Unicode, vì VS6 không hỗ trợ hoàn toàn Unicode trong IDE nên bạn sẽ gặp 1 số hạn chế khi hiển thị giao diện tiếng Việt. Đây là vấn đề khá dài dòng nên bạn có thể tìm hiểu thêm ở các bài báo trên mạng nói về chuyện này (như ở pcworld.com.vn). - Trước tiên bạn cần biên dịch ứng dụng ớ dạng Unicode. VC6 có tuỳ chọn trong Project Setting cho bạn thực hiện điều này. Với việc biên dịch với tuỳ chọn này, trình biên dịch sẽ thiết lập sẵn các control dùng trong ứng dụng có thể hiển thị font Unicode. - Sử dụng các hàm (API) liên quan đến chuỗi dạng generic hoặc unicode. Vd như thay vì sử dụng chuỗi dạng literal string như mystr = "test" thì dùng mystr = _T("test"); thay vì dùng strcpy để copy chuỗi thì dùng _tcscpy(...), ...còn nhiều API khác bạn nên tham khảo MSDN. - Khi nhận dữ liệu từ user hoặc đọc từ database: nếu dữ liệu đó không phải ở dạng unicode sẵn (MBCS chẳng hạn) thì bạn cần chuyển đổi trước khi xuất trên giao diện. Bạn tham khảo các hàm/macro hỗ trợ chuyển đổi như: USES_CONVERSION, A2T, T2A, ... Thân 
Có nhiều cách hiển thị tiếng Việt trong VC ví dụ sử dụng cách viết hàm conver trong VC giống như bài báo của Doandinhdan trên PCworld. Hoặc viết 1 class riêng định nghĩa các Object mới như cách của Hồ Tất Thành cũng trên báo PCworld. Nhưng cả 2 cách trên hình như ko áp dụng được cho với trường hợp lấy dữ liệu ra từ CSDL với định dạng unicode. Mình đã thử nhưng ko làm được. Mong bạn Z0rr0 chỉ rõ cho mình cũng như các bạn khác nhé. Nếu có VD demo thì tốt quá. P.S: Đây là 1 source ví dụ. Mình muốn cải tiến nó với 2 tác dụng thêm vào : 1-- Nhập được các trường unicode và hiển thị đúng chuỗi unicode nhật vào. 2-- Lấy dữ liệu ở dạng unicode và hiển thị ra trên màn hình điều khiển. http://www.yousendit.com/transfer.ph...609A053923338E cảm ơn bạn và mọi người đã quan tâm đến khó khăn của mình. Cheer-up.]]>
/hvaonline/posts/list/1326.html#6209 /hvaonline/posts/list/1326.html#6209 GMT
Unicode trong VC6 /hvaonline/posts/list/1326.html#6257 /hvaonline/posts/list/1326.html#6257 GMT Re: Unicode trong VC6 Code:
Function ToUTF8(ByVal UTF16 As Long) As Byte()
   ' Convert a 16bit UTF-16BE to 2 or 3 UTF-8 bytes
   Dim bArray() As Byte
   If UTF16 < &H80 Then
      ReDim bArray(0)  ' one byte UTF-8
      bArray(0) = UTF16  ' Use number as is
   ElseIf UTF16 < &H800 Then
      ReDim bArray(1)  ' two byte UTF-8
      bArray(1) = &H80 + (UTF16 And &H3F)  ' Least Significant 6 bits
      UTF16 = UTF16 \ &H40  ' Shift UTF16 number right 6 bits
      bArray(0) = &HC0 + (UTF16 And &H1F)  ' Use 5 remaining bits
   Else
      ReDim bArray(2)  ' three byte UTF-8
      bArray(2) = &H80 + (UTF16 And &H3F)  ' Least Significant 6 bits
      UTF16 = UTF16 \ &H40  ' Shift UTF16 number right 6 bits
      bArray(1) = &H80 + (UTF16 And &H3F)  ' Use next 6 bits
      UTF16 = UTF16 \ &H40  ' Shift UTF16 number right 6 bits again
      bArray(0) = &HE0 + (UTF16 And &HF)  ' Use 4 remaining bits
   End If
   ToUTF8 = bArray  ' Return UTF-8 bytes in an array
End Function


Function ToUTF16(bArray) As Long
   ' Convert 2 or 3 UTF-8 bytes to a 16bit UTF-16BE
   Dim IntUB
   IntUB = UBound(bArray)  ' Find out how many bytes UTF-8 takes
   Select Case IntUB
   Case 0  ' one byte UTF-8. Note that bArray starts with index=0
      ToUTF16 = bArray(0)  ' Use number as is
   Case 1  ' two byte UTF-8
      ToUTF16 = (bArray(0) And &H1F) * &H40 + (bArray(1) And &H3F)
   Case 2  ' three byte UTF-8
      ToUTF16 = (bArray(0) And &HF) * &H1000 + (bArray(1) And &H3F) * &H40 + (bArray(2) And &H3F)
   End Select
End Function
Dưới đây là kết quả khi bạn click nút UTF-16 -->UTF-8 rồi click nút UTF-8 -->UTF-16:
BOM (Byte Order Mark) Vì Unicode nói chung hổ trợ UTF-16BE, UTF-16LE và UTF-8, nên để có thể biết được Text file trong Microsoft Windows đang chứa Unicode encoding kiểu nào, ở đầu mỗi Unicode Text file có 2 hay 3 bytes gọi là Byte Order Mark như sau: Character Encoding Scheme Byte Order Mark UTF-16BE FE FF UTF-16LE FF FE UTF-8 EF BB BF Khi viết Unicode ra Text file trong MSWindows, nếu dùng UTF-8 bạn chỉ cần viết ở đầu file Byte Order Mark EF BB BF. Các bytes kế tiếp cứ theo đúng hoặc UTF-8 characters thì dùng 2 hay 3 bytes hoặc ANSI characters thì dùng 1 byte. Nếu dùng UTF-16LE (còn gọi gọn là Unicode trong ngôn ngữ Microsoft) thì viết Byte Order Mark FF FE. Kế đó mỗi character phải viết ra 2 bytes dù là Unicode hay không. Nếu character chỉ cần 1 byte, kể cả các characters như Carriage Return (&H0D) và LineFeed (&H0A), thì viết thêm byte thứ nhì là 00 (Null byte). Thí dụ: Character Encoding Scheme Các bytes viết ra Text file Text của file á à ả UTF-16LE FF FE E1 00 20 00 E0 00 20 00 A3 1E UTF-8 EF BB BF C3 A1 20 C3 A0 20 E1 BA A3 Khi bạn đọc Text file vào từng byte một bằng VB6, nhớ mở File dưới dạng Binary (as Binary) để có thể thấy luôn cả các Null bytes. Nếu bạn mở File dưới dạng Text File (as Input) thì sẽ không thấy các Null bytes. Câu hỏi đặt ra là Text File với encoding UTF-16LE hay UTF-8 chiếm nhiều chỗ hơn. Câu trả lời là tùy theo trường hợp. Ðối với UTF-16 thì mỗi character cần 2 bytes, kể cả ANSI characters. Ðối với UTF-8 thì nếu là Unicode character thì cần 2 hay 3 bytes, còn ANSI character thì chỉ cần 1 byte. Các Functions thông dụng cho Unicode Hoán chuyển ký tự từ Thường ra Hoa Chúng ta có tổng cộng 134 ký tự dùng cho các nguyên âm có dấu và hai chữ đ, Ð. Nếu trong program có chứa danh sách các Unicode với 67 chữ Thường theo sau bởi 67 chữ Hoa, ta có thể biến đổi một chữ từ LowerCase ra UpperCase, hay ngược lại rất dễ dàng. Dưới đây là Listing của Function UpperUniChar Code:
Function UpperUniChar(Ch) As String
   ' Return the Uppercase for a given vowel or dd
   Dim Pos  ' Position of character in Unicode vowel list
   ' Locate the character in list of Unicode vowels
   Pos = InStr(UVowels, Ch)
   If (Pos > 67) Then
      UpperUniChar = Ch  ' It's already uppercase - leave it alone
   ElseIf (Pos > 0) Then
      ' It's a Lowercase Unicode Vowel - so get the corresponding Uppercase vowel in the list
      UpperUniChar = Mid(UVowels, Pos + 67, 1)
   Else
      ' It's just a normal ANSI character
      UpperUniChar = UCase(Ch)
   End If
End Function
Dưới đây là kết quả khi bạn click nút ToUppercase
Tương tự như vậy ta có Function LowerUniChar. Ðể hoán chuyển cả một Unicode String ra chữ thường hay chữ Hoa ta có các Function UpperUniStr và LowerUniStr. Ngoài ra ta cũng có các Functions IsUniChar, IsUpperUniChar để kiểm tra xem character có phải là một Unicode Vowel hay là một Unicode Vowel Hoa. Function GetFileEncoding giúp ta nhận diện một Text file đã được encoded theo UTF-16LE, UTF-8 hay ANSI. Hoán chuyển ký tự cho trang Web Và sau cùng Function ToUniDecimal đổi Unicode characters ra dạng ✏ thích hợp cho các trang Web. Listing của Function ToUniDecimal như sau: Code:
Function ToUniDecimal(UniString As String) As String
   ' Return the HTML equivalent string of a Unicode string
   Dim i As Integer  ' Must declare as integer for CopyMemory to work
   Dim TLen, TStr
   Dim b1 As Byte
   Dim b2 As Byte
   Dim UTF16 As Long
   TLen = Len(UniString)  ' Get Length of input Unicode string
   If TLen = 0 Then Exit Function  ' Get out if null string
   ' Iterate through each character in the string
   For i = 1 To TLen
      If IsUniChar(Mid(UniString, i, 1)) Then
         ' Cast the String character to 2 bytes
         CopyMemory b1, ByVal StrPtr(UniString) + ((i - 1) * 2), 1
         CopyMemory b2, ByVal StrPtr(UniString) + ((i - 1) * 2) + 1, 1
         ' Combine the 2 bytes into the Unicode UTF-16
         UTF16 = b2  ' assign b2 to UTF16 before multiplying by 256 to avoid overflow
         UTF16 = UTF16 * 256 + b1
         ' Convert UTF-16 to format ✏ for HTML
         TStr = TStr & "&#" & Trim(CStr(UTF16)) & ";"
      Else
         ' Get here if it;s an ANSI character
         TStr = TStr & Mid(UniString, i, 1)
      End If
   Next
   ToUniDecimal = TStr  ' Return the HTML string
End Function
Dưới đây là kết quả khi bạn click nút ToUniDecimal
Ðọc viết Text file dưới dạng Unicode và UTF-8 Program Microsoft Notepad trong WindowsNT cho ta đánh Text dưới dạng ANSI, Unicode hay UTF-8. Ta có thể lập trình VB6 để đọc và viết Text file dưới cả hai dạng của Unicode. Khi Microsoft dùng chữ Save As Unicode là nói đến UTF-16LE. Cách gọn và tiện nhất để đọc và viết Unicode (UTF-16LE) là dùng FileSystemObject của Microsoft Script Runtime. Khi Fs.OpenTextFile nhớ dùng TristateTrue để cho biết bạn muốn đọc viết Unicode Text. Code:
Public Function ReadTextFile(FileName) As String 
   ' Write a Unicode String to UTF-16LE Text file
   ' Remember to Project | References "Microsoft Scripting Runtime" to support
   ' FileSystemObject & TextStream
   Dim Fs As FileSystemObject 
   Dim TS As TextStream 
   ' Create a FileSystem Object
   Set Fs = CreateObject("Scripting.FileSystemObject") 
   ' Open TextStream for Input.
   ' TriStateTrue means Read Unicode UTF-16LE
   Set TS = Fs.OpenTextFile(FileName, ForReading, False, TristateTrue) 
   ReadTextFile = TS.ReadAll  ' Read the whole content of the text file in one stroke
   TS.Close  ' Close the Text Stream
   Set Fs = Nothing  ' Dispose FileSystem Object
End Function
 
Public Sub WriteTextFile(FileName, StrOutText) 
   ' Read a Unicode String from UTF-16LE Text file
   ' Remember to Project | References "Microsoft Scripting Runtime" to support
   ' FileSystemObject & TextStream
   Dim Fs As FileSystemObject 
   Dim TS As TextStream 
   ' Create a FileSystem Object
   Set Fs = CreateObject("Scripting.FileSystemObject") 
   ' Open TextStream for Output, create file if necesssary
   ' TriStateTrue means Write Unicode UTF-16LE
   Set TS = Fs.OpenTextFile(FileName, ForWriting, True, TristateTrue) 
   TS.Write StrOutText  ' Write the whole StrOutText string in one stroke
   TS.Close  ' Close the Text Stream
   Set Fs = Nothing  ' Dispose FileSystem Object
End Sub
Cách gọn và tiện nhất để đọc và viết UTF-8 text files là dùng một VB6 Class tên clsUnicodeText dựa vào MS DOM (Document Object Model) và XML như sau: Code:
Dim MyUnicodeText As clsUnicodeText 
Set MyUnicodeText = New clsUnicodeText 
' Read Unicode Text from file txtFileName and display in TextBox1  
TextBox1.Text = MyUnicodeText.ReadUnicode(txtFileName) 

Listing của Class clsUnicodeText như sau:

Option Explicit 
Private mDOMTextFile As DOMDocument 
Private mXMLPath As String 
Public Function ReadUnicode(TXMLPath) 
   Dim objTextFileRoot As IXMLDOMElement 
   Set mDOMTextFile = New DOMDocument 
   mXMLPath = TXMLPath 
   mDOMTextFile.Load mXMLPath 
   'start at the root element of the XML
   Set objTextFileRoot = mDOMTextFile.documentElement 
   ReadUnicode = objTextFileRoot.nodeTypedValue 
End Function 

Public Sub WriteUnicode(OutText, Optional TXMLPath) 
   Dim tDOMNode As IXMLDOMElement  ' Temporary Node for DOM
   If IsMissing(TXMLPath) Then 
      ' Save the information on the screen by creating a new element and add its children to the DOM object
      mDOMTextFile.documentElement.Text = OutText 
      ' Update the XML file
      mDOMTextFile.save mXMLPath 
   Else 
      Set mDOMTextFile = New DOMDocument 
      ' Create a Node called "Text" in DOM
      Set tDOMNode = mDOMTextFile.createElement("Text") 
      ' Make it the Root Node
      mDOMTextFile.appendChild tDOMNode 
      ' Assign Output Text to Root Node
      mDOMTextFile.documentElement.Text = OutText 
      ' Update the XML file
      mDOMTextFile.save TXMLPath 
   End If 
End Sub
Nhưng nếu bạn muốn viết và đọc trực tiếp một Text file với encoding UTF-16LE hay UTF-8 thì bạn cũng có thể làm được với VB6 bằng cách đọc và viết trong Binary mode, tức là Open file as Binary. Khi viết ra thì sau khi viết BOM bytes, ta viết hoặc 2 bytes cho mỗi UTF-16 character trong UTF-16LE encoding, hoặc 2 hay 3 bytes cho Unicode character và 1 byte cho ANSI trong UTF-8 encoding. Khi đọc vào, đối với UTF-16LE thì ta dùng trực tiếp 2 bytes cho mỗi character, nhưng đối với UTF-8 thì ta phải nhận ra &HE1 là byte đi đầu của 3 byte character , &HC3, &HC4, &HC5 và &HC6 là byte đi đầu của 2 byte character, để có thể hoán chuyển ra Unicode character cho input string. Các kỹ thuật nầy được cắt nghĩa trong Listing của Function UTF8ToUniStr như dưới đây: Code:
Function UTF8ToUniStr(BArray) As String 
   ' Convert a byte stream of UTF-8 to Unicode String
   Dim i As Long 
   Dim TopIndex As Long 
   Dim TwoBytes(1) As Byte 
   Dim ThreeBytes(2) As Byte 
   Dim AByte As Byte 
   Dim TStr As String 
   TopIndex = UBound(BArray)  ' Number of bytes equal TopIndex+1
   If TopIndex = 0 Then Exit Function  ' get out if there's nothing to convert
   i = 0  ' Initialise pointer
   ' Iterate through the Byte Array
   Do While i <= TopIndex 
      AByte = BArray(i)  ' fetch a byte
      If AByte = &HE1 Then 
         ' Start of 3 byte UTF-8 group for a character
         ' Copy 3 byte to ThreeBytes
         ThreeBytes(0) = BArray(i): i = i + 1 
         ThreeBytes(1) = BArray(i): i = i + 1 
         ThreeBytes(2) = BArray(i): i = i + 1 
         ' Convert Byte array to UTF-16 then Unicode
         TStr = TStr & ChrW(ToUTF16(ThreeBytes)) 
      ElseIf (AByte >= &HC3) And (AByte <= &HC6) Then 
         ' Start of 2 byte UTF-8 group for a character
         TwoBytes(0) = BArray(i): i = i + 1 
         TwoBytes(1) = BArray(i): i = i + 1 
         ' Convert Byte array to UTF-16 then Unicode
         TStr = TStr & ChrW(ToUTF16(TwoBytes)) 
      Else 
         ' Normal ANSI character - use it as is
         TStr = TStr & Chr(AByte): i = i + 1  ' Increment byte array index
      End If 
   Loop 
   UTF8ToUniStr = TStr  ' Return the resultant string
End Function

Những References và Components hổ trợ Unicode trong VB6 Trước hết muốn hiển thị Unicode cho chữ Việt ta cần phải dùng Menu command của VB6 IDE để Project | Components Microsoft Forms 2.0 Object Library. Cái ActiveX nầy cho ta những Label, TextBox, Listbox và ComboBox cần thiết để hiển thị chữ Việt trong Unicode. Kế đó, để tiện việc đọc và viết chữ Việt dưới dạng UTF-8, ta chứa Unicode text file trong một XML file giữa một cặp tags tên Text hay tên gì cũng được (đó cũng là root node) , rồi dùng Microsoft Document Object Model (DOM) để đọc và viết chữ Việt. Bạn nhớ Project | References Microsoft XML, v3.0. Nguyên phần Text là nodeTypedValue của root node của DOM. Làm như thế ta khỏi phải đọc từng byte rồi tìm cách chuyển data ấy qua Unicode String. Ở đây xin nhấn mạnh là bạn phải vui lòng dùng MSWindowsNT hay MSWindows2000 mới được. Bạn có thể dùng Notepad trong WindowsNTđể edit XML file chứa chữ Việt và lưu trử dưới format UTF-8. Ngoài ra để hiển thị record data chữ Việt Unicode trong một Grid bạn cũng cần phải Project | Components Microsoft Hierarchical FlexGrid Control 6.0 (OLEDB). Một khi Unicode text đã đuợc đọc vào trong VB6 Text String rồi, nó đuợc dùng y hệt như cho ANSI characters. Ðó là vì bên trong VB6 mỗi Unicode character hay ANSI character đều chiếm 2 bytes. Nói như thế có nghĩa là các Functions Left, Mid, InStr đều có thể đuợc dùng cho Unicode Text String như một ANSI String bình thường. Xin lưu ý: Hình chữ Ð có hai code points: &HD0 và &H110. Code point &HD0 là của chữ Latin Eth hoa ( chữ Latin Eth thường là ð) , còn code point &H110 là của chữ Latin d hoa với stroke ( chữ Latin d thường với stroke là đ ) . Do đó ta phải dùng code point &H110. Bạn có thể copy chữ Ð nầy ngay từ Browser để paste vào chỗ nào cần thiết (vovisoft)]]>
/hvaonline/posts/list/1326.html#6277 /hvaonline/posts/list/1326.html#6277 GMT
Unicode trong VC6

hakuso wrote:
Bạn đã tham khảo bài viết này chưa :) http://www.pcworld.com.vn/pcworld/magazine_a.asp?t=mzdetail&atcl_id=5f5e5c56585956 
Cái này đã làm rồi. Nhưng ko đc. To hong_xanh001: Vấn đề của mình là cái hiển thị CSDL và làm trong VC6 mà. Nếu viết hàm chuyển thì bài của Doan Dinh Dan đã làm rồi. ]]>
/hvaonline/posts/list/1326.html#6324 /hvaonline/posts/list/1326.html#6324 GMT
Re: Unicode trong VC6 Đây là hàm conver Code:
void CADOTestDlg::Convert_String(BYTE *string_in, wchar_t *string_out)
{
	int i, scnt = strlen((char*)string_in);
	wchar_t unicode;
	i = 0;
	while (i <scnt) 
	{ // duyet tung byte
		if (0xc2<= string_in[i] && string_in[i] <= 0xe0 &&
		0x80<= string_in[i+1] && string_in[i+1] <= 0xbf)
		{
		// 2byte
		unicode = (string_in[i++] & 0x3f)<<6;
		unicode += (string_in[i++] & 0x3f);
		*string_out= unicode;
		}
		else 
			if (0xe0<= string_in[i] && string_in[i] <= 0xef &&
				0x80<= string_in[i+1] && string_in[i+1] <= 0xbf &&
				0x80<= string_in[i+2] && string_in[i+2] <= 0xbf) 
			{
			// 3byte
				unicode = (string_in[i++] & 0x0f)<<12;
				unicode += ((string_in[i++] & 0x3f)<<6);
				unicode += (string_in[i++] & 0x3f);
				*string_out = unicode;
			} 
			else 
				{ // 1byte
					*string_out = string_in[i++];
				}
				string_out++;
		}
		// chua ma ket thuc chuoi
	*string_out = 0;
}
Còn đây là đoạn code lấy dữ liệu từ CSDL: Code:
_CommandPtr pCommand;

HRESULT hr = pCommand.CreateInstance (__uuidof (Command));
pCommand->ActiveConnection = m_pConn;
pCommand->CommandText = "Sxlect * From Student";
_RecordsetPtr pRecordset;

hr = pRecordset.CreateInstance (__uuidof (Recordset));
pRecordset->CursorLocation = adUseClient;
pRecordset->Open ((IDispatch *) pCommand, vtMissing, adOpenForwardOnly,adLockReadOnly, adCmdUnknown);
CString strContent;
m_ctrlList.ResetContent ();
wchar_t unicode_string[256];
while (!pRecordset->GetadoEOF ())
	{
	strContent = (char *) (_bstr_t) pRecordset->Fields->GetItem ("Name")->Value;
	strContent += " / " ;
	strContent += (char *) (_bstr_t) pRecordset->Fields->GetItem ("SocialSecNo")->Value;
	BYTE * temp=0;
	for(int i=0;i< strContent.GetLength() ;i++)
	{
		temp[i]=strContent.GetAt(i);
	}
	Convert_String(temp,unicode_string);
	m_ctrlList.SetItemData (m_ctrlList.AddString (unicode_string), (DWORD) pRecordset->Fields->GetItem ("StudentNo")->Value.lVal);
	Recordset->MoveNext ();
	}

pRecordset->Close ();
]]>
/hvaonline/posts/list/1326.html#6586 /hvaonline/posts/list/1326.html#6586 GMT
Re: Unicode trong VC6 /hvaonline/posts/list/1326.html#6644 /hvaonline/posts/list/1326.html#6644 GMT Unicode trong VC6 Code:
BYTE * temp=0;
 for(int i=0;i< strContent.GetLength() ;i++)
 {
 	temp[i]=strContent.GetAt(i);
 }
Bạn chưa cấp phát vùng nhớ cho *temp mà đã dùng -> crash. Và nên chú ý là các class của MFC chỉ sử dụng được unicode, cụ thể là với wchar_t, khi biên dịch có khai báo macro UNICODE & _UNICODE. ]]>
/hvaonline/posts/list/1326.html#6661 /hvaonline/posts/list/1326.html#6661 GMT
Unicode trong VC6

light.phoenix wrote:
Bạn chưa cấp phát vùng nhớ cho *temp mà đã dùng -> crash. Và nên chú ý là các class của MFC chỉ sử dụng được unicode, cụ thể là với wchar_t, khi biên dịch có khai báo macro UNICODE & _UNICODE.  
Mình ko hiểu sửa đoạn này thế nào. temp mình đã khởi tạo ban đầu =0; Hơn nữa project này mình cũng đã đặt ở chế độ UNICODE. Mình nghĩ chắc trong đoạn vòng For có vấn đề. ]]>
/hvaonline/posts/list/1326.html#6679 /hvaonline/posts/list/1326.html#6679 GMT
Unicode trong VC6 /hvaonline/posts/list/1326.html#6724 /hvaonline/posts/list/1326.html#6724 GMT Unicode trong VC6 Code:
strContent = (char *) (_bstr_t) pRecordset->Fields->GetItem ("Name")->Value;
Như vấn đề bạn nêu, database bạn chứa dữ liệu Unicode. Property Value lấy từ RecordSet trả về giá trị BSTR, nếu bạn biên dịch ứng dụng với option Unicode thì BSTR đó cũng là Unicode, do đó bạn convert bằng type cast về char* ((char *) (_bstr_t) ) sẽ làm mất dữ liệu. Do đó, sau đó cho dù bạn convert ngược lại Unicode cũng ko còn đúng nữa. Bạn nên áp dụng như tôi đã đề cập ở bài post đầu: - Biên dịch với tuỳ chọn Unicode cho ứng dụng. - Khi cần ép kiểu, thì ép về kiểu generic LPCTSTR, thay vì là char* (các kiểu generic sẽ chuyển về Unicode khi biên dịch dạng Unicode). VD: Code:
strContent = (LPCTSTR) (_bstr_t) pRecordset->Fields->GetItem ("Name")->Value;
- Các thư viện SDK, MFC đều có sẵn các hàm convert từ MBCS sang Unicode và ngược lại, bạn không cần viết lại hàm convert chi cho nhọc sức và có thể không chính xác. Hãy xem các macro USE_CONVERSION tôi đã đề cập, ngoài ra có các API như MultiByteToWideChar, ... Đề nghị xem MSDN. MFC (Microsoft Foundation Classes) được build cho cả dạng Multibyte (MBCS) và Unicode, ví dụ như CString. Chỉ một số ít bắt buộc phải dùng Unicode. Khi biên dịch tuỳ thuộc vào setting project của bạn mà compiler sẽ sử dụng MB hay Unicode. Mở một project bằng VC++ 6. Vào menu Projects/Settings, tab C/C++ ở phần Preprocessor definitions bạn sẽ thấy default là có _WINDOWS, _MBCS. Khi này CString sẽ là chuỗi Multibyte (các kí tự 1 byte). Để biên dịch Unicode bạn thay _MBCS thành _UNICODE. Khi đó CString sẽ là chuỗi Unicode.]]>
/hvaonline/posts/list/1326.html#6764 /hvaonline/posts/list/1326.html#6764 GMT
Unicode trong VC6 /hvaonline/posts/list/1326.html#7699 /hvaonline/posts/list/1326.html#7699 GMT