Spanish [B4J] [Solucionado] Prevenir introduccion del caracter "espacio" mediante la combinacion de "Alt + 255"

Dadaista

Active Member
Licensed User
Longtime User
Hola

Tengo un pequeño problema que no se como solucionar. Un dia mirando la base de datos me di cuenta que habia campos, obligatorios, que estaban vacios. Como puede ser esto posible me preguntaba. Controlando que el campo no quedara vacio con el .trim y si esta vacio pues no grabamos.

Me he percatado que el B4XFloatTextField.Trim, que es el control que estoy utilizando, no funciona en ese caso... El caso es que el gracioso del usuario meta la combinacion de teclas (Alt + 255) que lo que escribe es un espacio como todos sabemos. Para el B4XFloatTextField eso no es un espacio y se salta el .Trim. (no se si en el TextField "normal", tambien ocurre).

He probado varias cosas y ninguna ha funcionado. El B4XFloatTextField.text.Replace (" ", " ") (el primer espacio es alt + 255) y el segundo espacio es el espacio de la barra espaciadora... no funciona tampoco.... no hace el Replace!! me refiero a que hago el trim y queda el espacio de la combinacion que no lo debe tomar como espacio.😬

Bueno, pues en B4XFloatTextField_TextChanged (Old as String, New as String) le digo que si New es la combinacion, que la cambie por un espacio normal... pues muy a mi pesar, tampoco funciona. El caso es que el control "sabe" que es la combinacion pero no lo cambia.
B4XFloatTextField_TextChanged (Old As String, New As String):
If New = " " Then 'NO ES ESPACIO... ES ALT + 255
    Log("Cuidado")    'SI ENTRA!!
    New.Replace(" ", " ")'NO VA
End If
No se como solucionarlo y evidentemente esto es factible en todos los campos donde se tenga que introducir un texto y éste sea obligatorio... se salta los .Trim 😠

Como soluciono el asunto?... Teneis alguna idea?

Gracias!!
 

emexes

Expert
Licensed User
Longtime User
Tal vez intentarlo:

B4X:
'''If New = " " Then 'NO ES ESPACIO... ES ALT + 255
If New.Contains(Chr(255)) Then
    Log("Cuidado")    'SI ENTRA!!
    New.Replace(Chr(255), " ")
End If
 

angel_

Well-Known Member
Licensed User
Longtime User
Y así:

B4X:
If New.Length = 0 Then
    Log("Cuidado")    'SI ENTRA!!
End If
 

Mariano Ismael Castro

Active Member
Licensed User
Test:
Private Sub Button1_Click

'    Dim txtVacio As Boolean = B4XFloatTextField1.Text.Length = 0

    Dim txtVacio As Boolean = B4XFloatTextField1.Text.Trim.Length = 0

    Log("TextBox Vacio? " & txtVacio)

End Sub



Yo probe con esto
 

emexes

Expert
Licensed User
Longtime User
¿Cuál es la salida del registro de esta prueba cuando se produce el problema?

B4X:
If New.Length > 0 Then
    Dim Ch As Int = Asc(New)
    If Ch > 126 Then    'código de carácter ASCII normal más alto (sin problemas) es 126 (tilde)
        Log("Cuidado")    'SI ENTRA!!
        Log(New.Length & " " & Ch)
    End If
End If
 

PaulMeuris

Well-Known Member
Licensed User
Try this:
ALT-255 character code:
    Dim ftftext As String = B4XFloatTextField1.Text
    Dim lst As List
    lst.Initialize
    For i = 0 To ftftext.Length -1
        lst.Add(Asc(ftftext.CharAt(i)))
    Next
    Log(lst)
    Dim new As String = ""
    For i = 0 To lst.Size -1
        Dim val As Int = lst.Get(i)
        If val <> 160 Then new = new & Chr(val)        ' character 160 is a no-break space
    Next
    Log("*" & new & "*")
The ALT-255 key combination is replaced with the no-break space character in windows
 

TILogistic

Expert
Licensed User
Longtime User
?
Alt+255 en el teclado numérico de Windows inserta un espacio no quebrado (non-breaking space), que se ve como un espacio normal, pero evita que el texto se separe al final de una línea. Es un carácter invisible que puede ser útil para diversos propósitos, como evitar que un nombre de usuario sea "tomado" en línea o para agregar un pequeño espaciado invisible en la creación de texto.
Código ASCII:
Alt+255 corresponde al código ASCII 160, que representa el espacio no quebrado
 

TILogistic

Expert
Licensed User
Longtime User
use regex, para verificar o reemplazar (no visibles o especiales)

"\xFF" ' Busca el carácter con código hexadecimal FF (255)
ex.

En regex, para detectar un carácter con un código ASCII específico, se puede usar la notación hexadecimal o decimal en la expresión regular. En B4X, que usa la clase Regex, se puede buscar el carácter con una expresión que incluya \xFF (hexadecimal para 255) o \u00A0.
 
Last edited:

TILogistic

Expert
Licensed User
Longtime User
B4X:
Ejemplo busqueda.
B4X:
    Dim Text As String = $"HolaÿMundo Texto sin el carácter especial. Aquí hay un Alt+255: ÿ"$
    Dim Pattern As String = "\xFF"
    Dim Matcher As Matcher = Regex.Matcher(Pattern, Text)
    Do While Matcher.Find
        Log(Matcher.Match)
    Loop

1749447635947.png


usar
Regex.Replace 'reemplazar
Regex.IsMatch 'verificar si existe
 

Dadaista

Active Member
Licensed User
Longtime User
Hola

Gracias a Todos por vuestro tiempo

Subo un mini proyecto. La respuesta de @TILogistic con Regex, funciona... siempre que solo haya un caracter "especial". Si hay mas, no funciona. No se, quizas me estoy liando un poco. Tendria que hacer un bucle leyendo todos los caracteres del campo y mirar si es el dichoso espacio e intentar cambiarlo... no? El Regex no lo utilizo... deberia estudiarlo a fondo.

Gracias!!
 

Attachments

  • alt255.zip
    2.9 KB · Views: 75

emexes

Expert
Licensed User
Longtime User
Lista de espacios Unicode:

https://www.compart.com/en/unicode/category/Zs

B4X:
Sub MakeSpacesNormal(S As String) As String
    'from https://www.compart.com/en/unicode/category/Zs
    Dim NotNormalSpaces() As Int = Array As Int(                        _
        0x00A0, 0x1680, 0x2000, 0x2001, 0x2002, 0x2003, 0x2004, 0x2005, _
        0x2006, 0x2007, 0x2008, 0x2009, 0x200A, 0x202F, 0x205F, 0x3000  _
    )

    For Each Ch As Int In NotNormalSpaces
        Dim NotNormalSpace As String = Chr(Ch)
        If S.Contains(NotNormalSpace) Then
            S = S.Replace(NotNormalSpace, " ")    'replace funny space with normal space
        End If
    Next
 
    Return S
End Sub

Creo que también se podría hacer con regex pero aquí es la 1 de la mañana, así que lo dejaré para alguien más despierto que yo 🍻
 

Dadaista

Active Member
Licensed User
Longtime User
Creo que también se podría hacer con regex pero aquí es la 1 de la mañana, así que lo dejaré para alguien más despierto que yo
Solucionado @emexes

Paso la funcion al "libro de las funciones" 😄

Que descanses y Muchas gracias a todos!!

Salu2!!
 

TILogistic

Expert
Licensed User
Longtime User
simple y efectivo:
B4X:
    Dim Text As String = $"HolaÿMundo Texto sin el carácter especial. Aquí hay un Alt+255: ÿ"$
    Dim Pattern As String = "[\xFF\x00-\x1F\x7F]+" ' Caracteres de control Unicode
    Dim Text As String = Regex.Replace(Pattern, Text, " ")
    Log(Text)
1749492652980.png
 

TILogistic

Expert
Licensed User
Longtime User
pruebe esto : vera que al digitar alt+255 cambia el caracter a una X
B4X:
Private Sub B4XFloatTextField1_TextChanged (Old As String, New As String)
    Dim Pattern As String = "\u00A0" ' Caracteres de control Unicode
    B4XFloatTextField1.Text = Regex.Replace(Pattern, New, "X")
    B4XFloatTextField1.TextField.SelectionStart = B4XFloatTextField1.Text.Length + 1
End Sub

1.gif


Nota:
utilizo mucho regex en los edittext para controlar los caracteres no validos, en mis vistas
 

Attachments

  • alt255-2.zip
    2.4 KB · Views: 70

Dadaista

Active Member
Licensed User
Longtime User
pruebe esto : vera que al digitar alt+255 cambia el caracter a una X
Hola

Si, asi es... cambia por una X pero no se por qué su código no me ha funcionado. La verdad es que estoy un poco confuso... no sé por qué no funciona el código que escribió en el post #17... estoy un poco alucinado ahora mismo. Estoy esperando para lanzar la actualización hasta que esto no me quede claro. Ahora lo cambio por un espacio y parece que si funciona. Estaré haciendo algo mal?... lo que me pareció es que no hacia el "Replace"

Gracias!!
 
Top