Existe uma maneira para ver se um personagem está usando 1 ou 2 bytes em Delphi 2009?

votos
4

Delphi 2009 mudou seu tipo string para usar 2 bytes para representar um personagem, que permite suporte para conjuntos de unicode de caracteres. Agora, quando você começa sizeof (string), obtém comprimento (String) * sizeof (char). Sizeof (char) actualmente a ser 2.

O que eu estou interessado em saber se alguém sabe de uma maneira que em um personagem por base caráter é possível descobrir se ele iria caber em um único byte, por exemplo, descobrir se um char é ASCII ou Unicode.

O que eu estou principalmente interessado em saber, é antes de minha corda vai para um banco de dados (Oracle, Documentum) quantos bytes a corda irá utilizar-se.

Precisamos ser capazes de impor limites antes da mão e, idealmente (como temos uma grande base instalada) sem ter que alterar o banco de dados. Se um campo de cadeia permite que 12 bytes, em delphi 2009, uma cadeia de comprimento 7 sempre mostrar como a utilização de 14 bytes, embora uma vez que chegou ao db só usaria 7 se ascii ou 14 se double byte, ou algures no meio se um mistura.

Publicado 10/10/2008 em 10:07
fonte usuário
Em outras línguas...                            


7 respostas

votos
5

Você pode verificar o valor do caráter:

if ord(c) < 128 then
    // is an ascii character
Respondeu 10/10/2008 em 10:09
fonte usuário

votos
4

Primeiro de tudo, tenha em mente que seus comprimentos de banco de dados pode realmente estar em caracteres, não bytes - você vai ter que verificar a documentação para o tipo de dados. Eu estou indo supor que ele realmente é o último para a propósito da pergunta.

A quantidade de bytes a cadeia vai usar depende inteiramente da codificação de caracteres que ele vai ser armazenado com. Se é UTF-16, do tipo string padrão em Delphi, em seguida, ele será sempre 2 bytes por caractere, excluindo substitutos.

A codificação mais provável, assumindo que a base de dados utiliza um conjunto de caracteres Unicode, no entanto, é UTF-8. Esta é uma codificação de comprimento variável: caracteres pode exigir qualquer lugar entre 1 e 4 bytes, dependendo do carácter. Você pode ver um gráfico na Wikipedia de como as faixas são mapeados.

No entanto, se você não está mudando o esquema de banco de dados em tudo, então isso deve significar uma de três coisas:

  1. Você está atualmente armazenar tudo de uma forma binária, em vez de uma forma textual (geralmente não uma boa escolha)
  2. O banco de dados já armazena Unicode e caracteres contados, e não bytes (caso contrário, você teria o problema agora, ainda mais no caso de letras acentuadas)
  3. As lojas de banco de dados em uma página de códigos de byte único, como o Windows-1252, impedindo-o de armazenar dados Unicode em tudo (tornando-se um não-problema, porque os caracteres serão armazenados da mesma forma que antes, embora você não pode fazer uso de Unicode)

Eu não estou familiarizado com a Oracle, mas se você olhar para MSSQL, eles têm dois tipos de dados diferentes: varchar e nvarchar. VARCHAR conta em bytes, enquanto que as contagens de nvarchar em caracteres, sendo por isso adequado para Unicode. MySQL, por outro lado, só tem varchar, e sempre conta em caracteres (como de 4,1). Você deve, portanto, verificar a documentação do Oracle e seu esquema de banco de dados para obter uma resposta decisiva sobre se é ou não é um problema de todos.

Respondeu 10/10/2008 em 15:29
fonte usuário

votos
2

Você pode usar StringElementSize função de descobrir se uma string é Unicode ou ANSI. Para verificar se um caractere é ANSI, use TCharacter.IsAnsi função de classe na unidade Character.pas.

Respondeu 24/12/2008 em 21:08
fonte usuário

votos
2

Se você não quiser usar Unicode em Delphi 2009, você pode usar o tipo AnsiString. Mas por que deveria.

Um teste complicado, mas válido poderia ser:

function IsAnsi(const AString: string): Boolean;
var
  tempansi : AnsiString;
  temp : string;
begin
  tempansi := AnsiString(AString);
  temp := tempansi;
  Result := temp = AString;
end;
Respondeu 10/10/2008 em 10:21
fonte usuário

votos
1

Você respondeu que você realmente quer descobrir quantos bytes a cadeia vai ocupar.

Como sobre a conversão para UTF8String? Ansi personagens vão levar até 1 byte. Tenha em mente que em UTF-8, caracteres Unicode pode levar mais de 2 bytes.

Respondeu 07/11/2008 em 15:51
fonte usuário

votos
0

Uma vez que com um caractere AnsiString = 1 byte e com Unicode corda 1 de resíduo carbonado = 2 bytes, o teste é simples de executar IsAnsiString: = sizeof (aString) = comprimento (aString);

Respondeu 21/10/2008 em 17:24
fonte usuário

votos
-1

Um caractere ASCII cabe sempre em um byte. Você não pode dizer o mesmo para um caractere Unicode, uma vez que depende de como ela é codificada. Você não pode ver a partir de um único byte se for um caractere ASCII ou unicode ou se é um personagem em tudo para essa matéria. Então, qual é a sua pergunta de novo? E por que você precisa saber? Meu palpite é que você entendeu mal unicode ou eu não entendi sua pergunta.

Respondeu 10/10/2008 em 10:10
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more