Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Показать сообщение отдельно

Новый участник


Сообщения: 14
Благодарности: 0

Профиль | Отправить PM | Цитировать


Я пытаюсь перевести конвертер ASCI ->UTF-8 с C на autoit . Но видимо что-то не правильно понимаю. На вход функции подаю C3, а на выходе получаю C3 83, что явно неправильно. Или правильно и ошибка в другом?
Код на C
Код: Выделить весь код
int conv_x2utf(unsigned char* bufin, int len, unsigned char* bufout)
{ int i, j = 0;

  for (i = 0; i < len; i++)
  {
    if (bufin[i] >= 0x80)
    { bufout[j++] = (((bufin[i] >> 6) & 0x3f) | 0xc0);
      bufout[j++] = (bufin[i] & 0x3f) | 0x80;
    }
    else
      bufout[j++]  = bufin[i];
  }

  return j;
}
Autoit:
Код: Выделить весь код
Func StringToUTF($String)
Dim $String
$VarUTFArr = StringSplit ( $String, "" )

For $i = 1 To $VarUTFArr[0]
$code = Asc ($VarUTFArr[$i])

If $code < 128 Then
$VarUTFArr[$i] = Chr ($code)
	Else 
$VarSt1 = BitOR (BitAND ((BitShift ($code, 6)), 0x3f), 0xc0)
$VarSt2 = BitOR (BitAND ($code, 0x3f), 0x80)
$VarUTFArr[$i] = Chr ($VarSt1) & Chr ($VarSt2)
	EndIf
Next

Dim $sResult
For $iCntr = 1 To $VarUTFArr[0]
	$sResult = $sResult & $VarUTFArr[$iCntr]
	If ($iCntr < $VarUTFArr[0]) Then
		$sResult = $sResult
	EndIf
Next

Return $sResult
EndFunc
Нашёл исходник конвертера на FoxPro. И он работает!
Код: Выделить весь код
Func StringToUTF($String)
Dim $String
$VarUTFArr = StringSplit ( $String, "" )

For $i = 1 To $VarUTFArr[0]
$code = Asc ($VarUTFArr[$i])

Select
     Case $code >= 192 AND $code <= 239
         $VarUTFArr[$i] = Chr (208) & Chr ($code-48)
     Case $code >= 240 AND $code <= 255
         $VarUTFArr[$i] = Chr (209) & Chr ($code-112)
     Case $code = 168
         $VarUTFArr[$i] = Chr (208) & Chr (129)     
     Case $code = 184
         $VarUTFArr[$i] = Chr (209) & Chr (145)     
     Case Else
        $VarUTFArr[$i] = Chr ($code)
EndSelect
	
Next

Dim $sResult
For $iCntr = 1 To $VarUTFArr[0]
	$sResult = $sResult & $VarUTFArr[$iCntr]
	If ($iCntr < $VarUTFArr[0]) Then
		$sResult = $sResult
	EndIf
Next

Return $sResult
EndFunc

Последний раз редактировалось Lexi, 01-05-2006 в 21:44.


Отправлено: 17:53, 01-05-2006 | #140