Skip to content

cWinsock Encoding Guide

📖 Table of Contents


Overview

cWinsock supports multiple text encoding methods to adapt to different application scenarios. Proper use of encoding is crucial for ensuring data transmission accuracy and compatibility.


Encoding Types

🇨🇳 ScpAcp (ACP/GBK)

Value: 0

Description: System default code page (ANSI Code Page)

Characteristics:

  • GBK encoding on Chinese Windows
  • Consistent with VB6 internal string storage
  • Single-byte characters 1 byte, Chinese characters 2 bytes
  • Suitable for local applications in Chinese environment

Use Cases:

  • Traditional VB6 applications
  • Applications with mainly Chinese characters
  • Compatible with existing VB6 systems

Example:

vb
' Default uses ACP/GBK encoding
m_oClient.SendData "中文测试"
m_oClient.GetData sData

🌐 ScpUtf8 (UTF-8)

Value: 65001

Description: UTF-8 encoding

Characteristics:

  • International standard, supports all Unicode characters
  • Compatible with ASCII
  • Single-byte characters 1 byte, Chinese characters 3 bytes
  • Preferred encoding for network transmission

Use Cases:

  • Web applications
  • Internationalized applications
  • Interacting with modern systems
  • Need to support multiple languages

Example:

vb
' Use UTF-8 encoding
m_oClient.SendData "中文测试", ScpUtf8
m_oClient.GetData sData, , , ScpUtf8

🌟 ScpUnicode (Unicode)

Value: -1

Description: Unicode encoding (no conversion)

Characteristics:

  • Keeps strings as wide characters (UTF-16)
  • No encoding conversion
  • Each character 2 bytes (most characters)

Use Cases:

  • Internal data transmission
  • Need to preserve original string format
  • Don't want encoding conversion

Example:

vb
' Use Unicode (no conversion)
m_oClient.SendData "中文测试", ScpUnicode
m_oClient.GetData sData, , , ScpUnicode

Default Encoding

SendData Default Encoding

vb
Public Sub SendData(Data As Variant, Optional ByVal CodePage As EnumScpCodePage = ScpAcp)

Default Value: ScpAcp (0) - ACP/GBK

GetData/PeekData Default Encoding

vb
Public Sub GetData(Data As Variant, Optional ByVal VarType_ As Long, Optional ByVal MaxLen As Long = -1, Optional ByVal CodePage As EnumScpCodePage = ScpAcp)
Public Sub PeekData(Data As Variant, Optional ByVal VarType_ As Long, Optional ByVal MaxLen As Long = -1, Optional ByVal CodePage As EnumScpCodePage = ScpAcp)

Default Value: ScpAcp (0) - ACP/GBK

Design Reason

  • Consistent with traditional VB6 encoding
  • Compatible with most VB6 applications
  • Avoid garbled text from encoding inconsistencies

Encoding Selection Recommendations

🎯 Scenario 1: New Network Applications

Recommendation: Use UTF-8

vb
' Send
m_oClient.SendData "Hello 世界", ScpUtf8

' Receive
Private Sub m_oClient_DataArrival(Client As cWinsock, ByVal bytesTotal As Long)
    Dim sData As String
    Client.GetData sData, , , ScpUtf8
    Debug.Print sData ' "Hello 世界"
End Sub

Advantages:

  • Internationalization support
  • Compatible with modern systems
  • Web standard encoding

🏢 Scenario 2: Traditional VB6 Applications

Recommendation: Use default ACP/GBK

vb
' Send (default ACP)
m_oClient.SendData "中文测试"

' Receive (default ACP)
Private Sub m_oClient_DataArrival(Client As cWinsock, ByVal bytesTotal As Long)
    Dim sData As String
    Client.GetData sData
    Debug.Print sData ' "中文测试"
End Sub

Advantages:

  • Consistent with VB6 internal encoding
  • No extra encoding settings needed
  • Compatible with existing code

🌍 Scenario 3: Mixed Encoding Environment

Recommendation: Dynamically select based on peer's encoding

vb
' Detect peer encoding before sending
Private Sub SendDataAdaptive(ByVal sText As String)
    If m_oRemoteEncoding = "UTF8" Then
        m_oClient.SendData sText, ScpUtf8
    Else
        m_oClient.SendData sText, ScpAcp
    End If
End Sub

' Receive with encoding detection
Private Sub m_oClient_DataArrival(Client As cWinsock, ByVal bytesTotal As Long)
    Dim sData As String
    
    If m_oRemoteEncoding = "UTF8" Then
        Client.GetData sData, , , ScpUtf8
    Else
        Client.GetData sData
    End If
    
    ProcessData sData
End Sub

🔧 Scenario 4: Protocol Encoding Negotiation

Recommendation: Negotiate encoding when connection established

vb
' Send encoding negotiation after connection
Private Sub m_oClient_Connect(Client As cWinsock)
    ' Send supported encoding list
    Client.SendData "ENCODING:SUPPORT:ACP,UTF8", ScpUtf8
End Sub

' Server response
Private Sub m_oServer_DataArrival(Client As cWinsock, ByVal bytesTotal As Long)
    Dim sData As String
    Client.GetData sData, , , ScpUtf8
    
    If Left$(sData, 21) = "ENCODING:SUPPORT:" Then
        ' Select encoding
        Dim sEncodings() As String
        sEncodings = Split(Mid$(sData, 22), ",")
        
        ' Prefer UTF-8
        Dim sSelected As String
        If InStr("UTF8", sEncodings(0)) > 0 Then
            sSelected = "UTF8"
        Else
            sSelected = "ACP"
        End If
        
        ' Respond with selected encoding
        Client.SendData "ENCODING:SELECT:" & sSelected, ScpUtf8
        
        ' Save client's encoding
        Client.UserData = sSelected
    End If
End Sub

Common Issues

❓ Issue 1: Chinese Garbled Text

Symptom: Received Chinese displays as garbled text

Cause: Different encoding used for sending and receiving

Solution:

vb
' ✅ Correct: Use same encoding for send and receive
m_oClient.SendData "中文测试", ScpUtf8
' When receiving
Client.GetData sData, , , ScpUtf8

' ❌ Wrong: Inconsistent encoding
m_oClient.SendData "中文测试", ScpUtf8  ' Use UTF-8
' When receiving
Client.GetData sData  ' Use default ACP → garbled

❓ Issue 2: UTF-8 Byte Length Error

Symptom: Byte count doesn't match expectation

Cause: UTF-8 is variable-length encoding, Chinese characters occupy 3 bytes

Solution:

vb
' Calculate actual byte count
Function GetByteCount(ByVal sText As String, ByVal eCodePage As EnumScpCodePage) As Long
    Dim oSocket As New cAsyncSocket
    Dim baData() As Byte
    
    baData = oSocket.ToTextArray(sText, eCodePage)
    GetByteCount = UBound(baData) + 1
End Function

' Use
Dim lLen As Long
lLen = GetByteCount("中文测试", ScpUtf8)
Debug.Print lLen ' 12 (each Chinese character 3 bytes)

❓ Issue 3: Communicating with Web Server

Symptom: Web server returned content displays incorrectly

Cause: Web server usually uses UTF-8, but client used default encoding

Solution:

vb
' Send HTTP request (use UTF-8)
m_oClient.SendData "GET / HTTP/1.1" & vbCrLf & "Host: example.com" & vbCrLf & vbCrLf, ScpUtf8

' Receive response (use UTF-8)
Private Sub m_oClient_DataArrival(Client As cWinsock, ByVal bytesTotal As Long)
    Dim sData As String
    Client.GetData sData, , , ScpUtf8
    
    ' Parse response
    Debug.Print sData
End Sub

❓ Issue 4: Database Encoding Conflict

Symptom: Strings read from database display abnormally after network transmission

Cause: Database encoding inconsistent with network transmission encoding

Solution:

vb
' Read from database (assume database uses UTF-8)
Dim sData As String
sData = GetFromDatabase()

' Send directly (database already UTF-8)
' No conversion needed
m_oClient.SendData sData, ScpUtf8

' Or convert to ACP before sending
Dim baUtf8() As Byte
Dim sAcp As String
' First convert to UTF-8 byte array
baUtf8 = ConvertToUtf8Bytes(sData)
' Then convert to ACP string
sAcp = ConvertFromUtf8Bytes(baUtf8)
m_oClient.SendData sAcp

❓ Issue 5: File Transfer Encoding

Symptom: Content garbled after transferring text file

Cause: File encoding inconsistent with network transmission encoding

Solution:

vb
' Read text file
Private Function ReadFile(ByVal sFilePath As String, ByVal eCodePage As EnumScpCodePage) As String
    Dim iFileNum As Integer
    iFileNum = FreeFile
    
    Open sFilePath For Binary As #iFileNum
    Dim baData() As Byte
    ReDim baData(0 To LOF(iFileNum) - 1) As Byte
    Get #iFileNum, , baData
    Close #iFileNum
    
    Dim oSocket As New cAsyncSocket
    ReadFile = oSocket.FromTextArray(baData, eCodePage)
End Function

' Send file
Private Sub SendFile(ByVal sFilePath As String)
    Dim sContent As String
    
    ' Assume file is UTF-8 encoded
    sContent = ReadFile(sFilePath, ScpUtf8)
    
    ' Send using UTF-8
    m_oClient.SendData sContent, ScpUtf8
End Sub

Encoding Conversion Utility Functions

Encoding Detection

vb
' Simple UTF-8 detection
Function IsLikelyUtf8(ByVal sText As String) As Boolean
    ' Check for high-byte characters
    Dim i As Long
    For i = 1 To Len(sText)
        If AscW(Mid$(sText, i, 1)) > 255 Then
            IsLikelyUtf8 = True
            Exit Function
        End If
    Next
    IsLikelyUtf8 = False
End Function

Encoding Conversion

vb
' ACP to UTF-8 conversion
Function AcpToUtf8(ByVal sText As String) As String
    Dim oSocket As New cAsyncSocket
    Dim baAcp() As Byte
    Dim baUtf8() As Byte
    
    ' ACP → Byte array
    baAcp = oSocket.ToTextArray(sText, ScpAcp)
    
    ' Byte array → UTF-8 string (needs extra handling)
    ' VB6 needs to use Win32 API for conversion
    ' Simplified demonstration here
    
    AcpToUtf8 = sText ' Actual implementation needs to call MultiByteToWideChar
End Function

Best Practices

  1. Unified Encoding: Use same encoding for send and receive
  2. Explicit Specification: Always explicitly specify encoding parameter, don't rely on default
  3. Documentation: Record encoding used for each connection
  4. Encoding Negotiation: Negotiate encoding at protocol level
  5. Error Handling: Handle encoding conversion errors
vb
' Example: Network class wrapper
Public Sub SendText(ByVal oSocket As cWinsock, ByVal sText As String)
    On Error GoTo EH
    
    ' Use configured encoding
    Select Case m_eEncoding
        Case eEncoding.UTF8
            oSocket.SendData sText, ScpUtf8
        Case eEncoding.ACP
            oSocket.SendData sText, ScpAcp
        Case eEncoding.Unicode
            oSocket.SendData sText, ScpUnicode
    End Select
    
    Exit Sub
    
EH:
    Debug.Print "Send data failed: " & Err.Description
End Sub

❌ Avoid

  1. Mixed Encoding: Using different encodings on same connection
  2. Rely on Default: Not specifying encoding parameter, relying on default
  3. Ignore Detection: Not detecting encoding used by peer
  4. Blind Conversion: Converting without verification

Last Updated: 2026-01-09

VB6 and LOGO copyright of Microsoft Corporation