Como a cultura afeta cadeias de caracteres no Visual Basic

Esta página ajuda discute como o Visual Basic usa informações de cultura para executar conversões e comparações de cadeia de caracteres.

Quando usar cadeias de caracteres Culture-Specific

Normalmente, você deve usar cadeias de caracteres específicas da cultura para todos os dados apresentados e lidos dos usuários e usar cadeias de caracteres invariáveis de cultura para os dados internos do aplicativo.

Por exemplo, se o aplicativo solicitar que os usuários insiram uma data como uma cadeia de caracteres, ele deverá esperar que os usuários formatem as cadeias de caracteres de acordo com sua cultura e o aplicativo deve converter a cadeia de caracteres adequadamente. Se o aplicativo apresentar essa data em sua interface do usuário, ele deverá apresentá-la na cultura do usuário.

No entanto, se o aplicativo carregar a data para um servidor central, ele deverá formatar a cadeia de caracteres de acordo com uma cultura específica, para evitar confusão entre formatos de data potencialmente diferentes.

Culture-Sensitive Functions

Todas as funções de conversão de cadeia de caracteres do Visual Basic (exceto Str funções e Val funções) usam as informações de cultura do aplicativo para garantir que as conversões e comparações sejam apropriadas para a cultura do usuário do aplicativo.

A chave para usar com êxito funções de conversão de cadeia de caracteres em aplicativos executados em computadores com diferentes configurações de cultura é entender quais funções usam uma configuração de cultura específica e que usam a configuração de cultura atual. Observe que as configurações de cultura do aplicativo são, por padrão, herdadas das configurações de cultura do sistema operacional. Para obter mais informações, consulte Asc, AscW, Chr, ChrW, Format, Hex, Oct e funções de conversão de tipo.

As funções Str (converte números em cadeias de caracteres) e Val (converte cadeias de caracteres em números) não usam as informações de cultura do aplicativo ao converter entre cadeias de caracteres e números. Em vez disso, eles reconhecem apenas o período (.) como um separador decimal válido. Os análogos culturalmente conscientes dessas funções são:

  • Conversões que usam a cultura atual. As CStr funções e Format as funções convertem um número em uma cadeia de caracteres e as CDbl funções convertem CInt uma cadeia de caracteres em um número.

  • Conversões que usam uma cultura específica. Cada objeto numérico tem um ToString(IFormatProvider) método que converte um número em uma cadeia de caracteres e um Parse(String, IFormatProvider) método que converte uma cadeia de caracteres em um número. Por exemplo, o tipo Double fornece os métodos ToString(IFormatProvider) e Parse(String, IFormatProvider).

Para obter mais informações, consulte Str e Val.

Usando uma cultura específica

Imagine que você está desenvolvendo um aplicativo que envia uma data (formatada como uma cadeia de caracteres) para um serviço Web. Nesse caso, seu aplicativo deve usar uma cultura específica para a conversão de cadeia de caracteres. Para ilustrar o porquê, considere o resultado do uso do método da ToString() data: se o aplicativo usa esse método para formatar a data de 4 de julho, 2005, ele retorna "7/4/2005 12:00:00" quando executado com a cultura Estados Unidos inglês (en-US), mas retorna "04.07.2005 00:00:00" quando executado com a cultura alemã (de-DE).

Quando precisar executar uma conversão de cadeia de caracteres em um formato de cultura específico, você deverá usar a CultureInfo classe que é incorporada ao .NET Framework. Você pode criar um novo CultureInfo objeto para uma cultura específica passando o nome da cultura para o CultureInfo construtor. Os nomes de cultura com suporte são listados na página ajuda de CultureInfo classe.

Como alternativa, você pode obter uma instância da cultura invariável da CultureInfo.InvariantCulture propriedade. A cultura invariável é baseada na cultura inglesa, mas há algumas diferenças. Por exemplo, a cultura invariável especifica um relógio de 24 horas em vez de um relógio de 12 horas.

Para converter uma data na cadeia de caracteres da cultura, passe o CultureInfo objeto para o método do objeto date ToString(IFormatProvider). Por exemplo, o código a seguir exibe "07/04/2005 00:00:00", independentemente das configurações de cultura do aplicativo.

Dim d As Date = #7/4/2005#
MsgBox(d.ToString(System.Globalization.CultureInfo.InvariantCulture))

Observação

Literais de data são sempre interpretados de acordo com a cultura inglesa.

Comparando cadeias de caracteres

Há duas situações importantes em que são necessárias comparações de cadeia de caracteres:

  • Classificando dados para exibição para o usuário. Use operações com base na cultura atual para que as cadeias de caracteres classifiquem adequadamente.

  • Determinando se duas cadeias de caracteres internas do aplicativo correspondem exatamente (normalmente para fins de segurança). Use operações que desconsideram a cultura atual.

Você pode executar ambos os tipos de comparações com a função Visual Basic StrComp. Especifique o argumento opcional Compare para controlar o tipo de comparação: Text para a maioria das entradas e saídas Binary para determinar correspondências exatas.

A StrComp função retorna um inteiro que indica a relação entre as duas cadeias de caracteres comparadas com base na ordem de classificação. Um valor positivo para o resultado indica que a primeira cadeia de caracteres é maior que a segunda cadeia de caracteres. Um resultado negativo indica que a primeira cadeia de caracteres é menor e zero indica igualdade entre as cadeias de caracteres.

' Defines variables.
Dim testStr1 As String = "ABCD"
Dim testStr2 As String = "abcd"
Dim testComp As Integer
' The two strings sort equally. Returns 0.
testComp = StrComp(testStr1, testStr2, CompareMethod.Text)
' testStr1 sorts before testStr2. Returns -1.
testComp = StrComp(testStr1, testStr2, CompareMethod.Binary)
' testStr2 sorts after testStr1. Returns 1.
testComp = StrComp(testStr2, testStr1, CompareMethod.Binary)

Você também pode usar o parceiro .NET Framework da StrComp função, o String.Compare método. Esse é um método estático e sobrecarregado da classe de cadeia de caracteres base. O exemplo a seguir ilustra como esse método é usado:

Dim myString As String = "Alphabetical"
Dim secondString As String = "Order"
Dim result As Integer
result = String.Compare(myString, secondString)

Para obter um controle mais fino sobre como as comparações são executadas, você pode usar sobrecargas adicionais do Compare método. Com o String.Compare método, você pode usar o comparisonType argumento para especificar qual tipo de comparação usar.

Valor do comparisonType argumento Tipo de comparação Quando usar
Ordinal Comparação com base em bytes de componente de cadeias de caracteres. Use esse valor ao comparar: identificadores que diferenciam maiúsculas de minúsculas, configurações relacionadas à segurança ou outros identificadores não linguísticos em que os bytes devem corresponder exatamente.
OrdinalIgnoreCase Comparação com base em bytes de componente de cadeias de caracteres.

OrdinalIgnoreCase usa as informações de cultura invariáveis para determinar quando dois caracteres diferem apenas na capitalização.
Use esse valor ao comparar: identificadores que não diferenciam maiúsculas de minúsculas, configurações relacionadas à segurança e dados armazenados no Windows.
CurrentCulture ou CurrentCultureIgnoreCase Comparação com base na interpretação das cadeias de caracteres na cultura atual. Use esses valores ao comparar: dados exibidos para o usuário, a maioria das entradas do usuário e outros dados que exigem interpretação linguística.
InvariantCulture ou InvariantCultureIgnoreCase Comparação com base na interpretação das cadeias de caracteres na cultura invariável.

Isso é diferente do Ordinal e OrdinalIgnoreCase, porque a cultura invariável trata os caracteres fora de seu intervalo aceito como caracteres invariáveis equivalentes.
Use esses valores somente ao comparar dados persistentes ou exibir dados linguisticamente relevantes que exigem uma ordem de classificação fixa.

Considerações de segurança

Se o aplicativo tomar decisões de segurança com base no resultado de uma operação de comparação ou alteração de caso, a operação deverá usar o String.Compare método e passar Ordinal ou OrdinalIgnoreCase para o comparisonType argumento.

Confira também