Asc/Chr
Conversao caractere <-> codigo ASCII. Asc retorna o codigo de um caractere; Chr retorna o caractere do codigo. Essenciais pra manipular caracteres especiais (quebra de linha, tab).
Assinatura: Asc(cChar) -> nCodigo // Chr(nCodigo) -> cChar
Retorna: Numeric (Asc) / Character (Chr)
Dupla classica de conversao caractere-codigo. Em AdvPL voce nao tem caractere literal como em outras linguagens (sem escape \n) — precisa usar Chr(10) pra LF, Chr(13) pra CR.
Sintaxe
Asc(cChar) --> nCodigo // numero ASCII (0-255)
Chr(nCodigo) --> cChar // caractere correspondente
Tabela de caracteres uteis
| Codigo | Char | Uso |
|---|---|---|
| 9 | TAB | Chr(9) — separador de campo TSV |
| 10 | LF | Chr(10) — quebra de linha Unix |
| 13 | CR | Chr(13) — retorno de carro |
| 13+10 | CRLF | Chr(13)+Chr(10) — quebra Windows |
| 32 | espaco | Chr(32) — espaco em branco |
| 34 | " | Chr(34) — aspas dupla (em string literal) |
| 39 | ' | Chr(39) — aspas simples |
| 65 | A | Maiusculas começam em 65 |
| 97 | a | Minusculas começam em 97 |
Exemplos
// Asc — caractere pra numero
Asc("A") // 65
Asc("a") // 97
Asc("0") // 48
Asc(" ") // 32
// Chr — numero pra caractere
Chr(65) // "A"
Chr(97) // "a"
Chr(48) // "0"
Casos praticos
1. Quebra de linha em string (Windows)
// CRLF — padrao Windows pra texto
cTexto := "Linha 1" + Chr(13) + Chr(10) + "Linha 2"
MemoWrite("\spool\arq.txt", cTexto)
// Variavel constante (mais legivel)
#define CRLF Chr(13) + Chr(10)
cTexto := "Linha 1" + CRLF + "Linha 2"
2. Validar se char e letra
Static Function EhLetra(cChar)
Local n := Asc(Upper(cChar))
Return n >= 65 .And. n <= 90 // A-Z apos Upper
3. Validar se char e digito
Static Function EhDigito(cChar)
Local n := Asc(cChar)
Return n >= 48 .And. n <= 57 // 0-9
4. Aspas em string literal (clipper-style)
// Como inserir aspas dentro de string?
// Opcao 1: alternar aspas
cMsg := 'Cliente disse "ola"'
// Opcao 2: Chr(34) (quando precisa misturar)
cMsg := "Cliente disse " + Chr(34) + "ola" + Chr(34)
5. Remover caracteres especiais (TAB, CR, LF)
cTxt := StrTran(cTxt, Chr(9), " ") // TAB -> espaco
cTxt := StrTran(cTxt, Chr(13), "") // remove CR
cTxt := StrTran(cTxt, Chr(10), "") // remove LF
Pegadinhas
- Encoding — em base com encoding errado, caracteres acima de 127 (acentos) podem dar codigo diferente do esperado.
- Asc("") retorna 0 — nao excecao. Cuide se for usar em logica.
- Chr(0) e null byte — pode quebrar strings em algumas operacoes.
- Use #define pra constantes como CRLF — codigo mais legivel que
Chr(13)+Chr(10)espalhado.