Cómo convertir un WideString (u otra cadena larga) a una matriz de bytes en UTF-8?Cadena a byte matriz en UTF-8?
Respuesta
Una función como ésta hará lo que usted necesita:
function UTF8Bytes(const s: UTF8String): TBytes;
begin
Assert(StringElementSize(s)=1);
SetLength(Result, Length(s));
if Length(Result)>0 then
Move(s[1], Result[0], Length(s));
end;
se le puede llamar con cualquier tipo de cuerda y la RTL se convertirá de la codificación de la cadena que se pasa a UTF-8. Así que no se deje engañar por pensar que debe convertir a UTF-8 antes de llamar, simplemente pase cualquier cadena y deje que el RTL haga el trabajo.
Después de eso, es una copia de matriz bastante estándar. Tenga en cuenta la afirmación que llama explícitamente la suposición sobre el tamaño del elemento de cadena para una cadena codificada en UTF-8.
Si desea obtener el terminador cero se escribirían así:
function UTF8Bytes(const s: UTF8String): TBytes;
begin
Assert(StringElementSize(s)=1);
SetLength(Result, Length(s)+1);
if Length(Result)>0 then
Move(s[1], Result[0], Length(s));
Result[high(Result)] := 0;
end;
var S: UTF8String;
B: TBytes;
begin
S := 'Șase sași în șase saci';
SetLength(B, Length(S)); // Length(s) = 26 for this 22 char string.
CopyMemory(@B[0], @S[1], Length(S));
end.
Según lo que necesite para los bytes, es posible que desee incluir un terminador NULL.
Para el código de producción, asegúrese de probar la cadena vacía. Agregar el 3-4 LOC requerido simplemente dificultaría la lectura de la muestra.
Se produce un error si la cadena está vacía –
La cadena no está vacía. Contiene el valor '' Şase saşi în şase saci'' –
+1. ¡No todos (por decir lo menos!) Saben cómo funciona realmente la función 'Longitud '. –
Usted puede utilizar TEncoding.UTF8.GetBytes
en SysUtils.pas
+1. Esta es la mejor manera. –
Tenga en cuenta que si la cadena de entrada * ya * está codificada como UTF-8, 'GetBytes' será un desperdicio. El compilador convertirá la cadena de entrada en UnicodeString ya que es el único argumento de cadena que permite 'GetBytes', y' GetBytes' convertirá los caracteres a UTF-8 para generar su resultado. –
Si está utilizando Delphi 2009 o posterior (el Unicode versiones), la conversión de un WideString a un UTF8String es una instrucción de asignación simple:
var
ws: WideString;
u8s: UTF8String;
u8s := ws;
el compilador llamará a la función de la biblioteca hay que hacer la conversión, ya que sabe º en los valores de tipo UTF8String tienen una "página de códigos" de CP_UTF8
.
En Delphi 7 y posterior, puede utilizar la función de biblioteca proporcionada Utf8Encode
. Incluso para versiones anteriores, puede obtener esa función de otras bibliotecas, como el JCL.
También puede escribir su propia función de conversión de uso de la API de Windows:
function CustomUtf8Encode(const ws: WideString): UTF8String;
var
n: Integer;
begin
n := WideCharToMultiByte(cp_UTF8, 0, PWideChar(ws), Length(ws), nil, 0, nil, nil);
Win32Check(n <> 0);
SetLength(Result, n);
n := WideCharToMultiByte(cp_UTF8, 0, PWideChar(ws), Length(ws), PAnsiChar(Result), n, nil, nil);
Win32Check(n = Length(Result));
end;
Una gran parte del tiempo, sólo tiene que utilizar un UTF8String como una matriz, pero si realmente necesita una matriz de bytes, se puede usar las funciones de David y Cosmin. Si está escribiendo su propia función de conversión de caracteres, puede omitir el UTF8String e ir directamente a una matriz de bytes; simplemente cambie el tipo de devolución a TBytes
o array of Byte
. (También es posible que desee aumentar la longitud en uno, si desea que la matriz sea terminada en nulo. SetLength lo hará implícitamente a la cadena, pero a una matriz.)
Si tiene algún otro tipo de cadena que sea ni WideString, UnicodeString ni UTF8String, entonces la forma de convertirlo a UTF-8 es primero convertirlo a WideString o UnicodeString, y luego convertirlo nuevamente a UTF-8.
He los siguientes dos rutinas (código fuente puede ser descargado aquí - http://www.csinnovations.com/framework_utilities.htm):
función CsiBytesToStr (const pInData: TByteDynArray; pStringEncoding: TECsiStringEncoding; pIncludesBom: Boolean): string;
función CsiStrToBytes (const pInStr: cadena; pStringEncoding: TECsiStringEncoding; pIncludeBom: Boolean): TByteDynArray;
widestring -> UTF8:
http://www.freepascal.org/docs-html/rtl/system/utf8decode.html
lo contrario:
http://www.freepascal.org/docs-html/rtl/system/utf8encode.html
Tenga en cuenta que la asignación de un widestring a un AnsiString en un sistema D2009 pre (incluida la corriente de Free Pascal) se Convierta a la codificación ansi local, creando los caracteres.
Para la parte TBytes, vea la observación de Rob Kennedy anterior.
- 1. C#: Convertir byte [] en cadena codificada en UTF8
- 2. ¿Convertir cadena latin1 a utf8?
- 3. Cadena a byte [] y viceversa?
- 4. cómo convertir cadena a byte [] en C#
- 5. Cómo convertir (transcribir) una cadena de utf8 a ASCII (byte único) en C#?
- 6. Almacenar una cadena como UTF8 en C#
- 7. Cómo convertir una cadena a UTF8?
- 8. Cómo convertir UTF8 a Unicode
- 9. .NET System :: Cadena a UTF8-bytes almacenada en char *
- 10. La mejor forma de acortar cadena UTF8 en función de la longitud del byte
- 11. Verificar la cadena utf8 válida en Python
- 12. códec utf8 no puede decodificar byte 0x96 en python
- 13. ¿Cómo convertir una cadena simple a Byte Array en VBA?
- 14. byte Android lotes matriz
- 15. Gdiplus :: ¿Mapa de bits a matriz BYTE?
- 16. Convierte la lista <byte[]> en un byte [] matriz
- 17. Cómo truncar una cadena UTF8 en PHP?
- 18. Java - Byte [] a byte []
- 19. Java: byte [] a Byte []
- 20. Conversión de UTF8 a ASCII
- 21. Mostrar el byte [] a ImageView en Android
- 22. Byte Array a NSData
- 23. Cómo convertir una matriz (gestionada a no gestionada) <System :: Byte ^> a byte *?
- 24. La función devuelve matriz BYTE
- 25. Cómo convertir una cadena en byte en Java
- 26. ¿Qué es una matriz byte []?
- 27. Convertir byte en cadena en Java
- 28. Comparar byte [] a T
- 29. cadena convertir a matriz
- 30. ¿Convertir cadena ISO8859 a UTF8? ÄÖÜ => ¿Por qué?
+1. Will 'Assert (StringElementSize (s) = 1);' alguna vez fallará? –
@Cosmin No, no lo hará. ¡Esa es la cuestión de las aserciones! –
una pregunta ... ¿qué unidad debo agregar para usar StringElementSize()? (Lazarus). Perdón por tales preguntas, soy un novato – Mariusz