Estou aprendendo o livro "Go Programing Language", quando ele introduz string, ele diz que Go usa sistema de codificação utf-8, então é fácil verificar se uma string é um prefixo/sufixo de outra string base. Use as funções abaixo:
func HasPrefix(s, prefix string) bool {
return len(s) >= len(prefix) && s[:len(prefix)] == prefix
}
func HasSuffix(s, suffix string) bool {
return len(s) >= len(suffix) && s[len(s)-len(suffix):] == suffix
}
Gostaria de saber se existe algum sistema de codificação que falharia ao usar as funções acima para verificar prefixo/sufixo?
Uma codificação que seria quebrada
HasSuffix
é a Big5 : bytes entre (hex) 40 e 7E (inclusive) podem ser um caractere completo ou o segundo byte de um caractere de dois bytes.UTF-16 ou UTF-32 com marcas de ordem de bytes quebraria
HasSuffix
(porque o BOM emsuffix
geralmente não corresponderia a nada na posição correta ems
) mesmo se ambas as strings usassem a mesma ordem de bytes, e quebraria ambosHasPrefix
eHasSuffix
se não o fizessem. (Isso não é um problema na prática, no entanto, porque as marcas de ordem de bytes são usadas apenas para comunicação, nunca dentro da representação de uma linguagem para todas as strings.)Não li o livro que você mencionou, mas talvez esteja pensando em linguagens que não exigem uma codificação específica, de modo que essas funções precisariam saber a codificação de cada string e lidar com o caso de elas não terem a mesma codificação.
Pode-se argumentar que nem mesmo o UTF-8 tem a propriedade declarada, no sentido de que essas funções não reconheceriam que "e com acento agudo" (um caractere Unicode) é o mesmo caractere do mundo real que "e, seguido por um acento agudo combinado" (dois caracteres Unicode). Mas esse é obviamente um problema muito mais difícil.
Você pode olhar para UTF-8 como uma sequência de bytes, pontos de código ou caracteres. Muitos caracteres podem ser escritos de diferentes maneiras como sequências de pontos de código. Como exemplo, há a letra (letra e) seguida por (acento ') que se parece com é. Se você olhar para os caracteres, então “e” não é um prefixo de “é”, embora é comece com o ponto de código de e.
Use a função de nível mais alto disponível; há uma boa chance de que ela lide com tudo corretamente e resolva os casos rapidamente.