Jak wykryć niewidzialne znaki ASCII?

Nie możesz wyszukać danej nazwy, pomimo że prawidłowo wprowadzasz jej wartość? Po raz kolejny natrafiasz na krzaczki, kwadraty lub nie widoczne białe znaki w tekstach? Czas najwyższy by wprowadzić obsługę tychże nikczemnych znaków i pozbyć się niezręcznych sytuacji.

Problemem tutaj są znaki specjalne, które często nie są widoczne na pierwszy rzut oka. Często pojawiają się przez kopiowanie treści ze stron internetowych, zwłaszcza zagranicznych, gdzie używane są inne zestawy znaków i kodowania. Jednym z taki przypadków są niewidoczne białe znaki (non-printable ASCII characters), które mogą być np. odstępem tabulatora, przejściem do nowej linii czy końcem linii.

Poniżej przedstawiam skrypt, który wykrywa we wskazanych polach znaki z listy non-printable ASCII characters:

DROP TABLE IF EXISTS #non_printable_list

DECLARE @char_id INT = 1;

CREATE TABLE #non_printable_list (
	ORIGIN_VALUE NVARCHAR(300)
	, FIXED_VALUE NVARCHAR(300)
	, NON_PRINTABLE_CHAR NVARCHAR(15)
	, COLUMN_NAME NVARCHAR(150)
	)

-- obsługa znaków ASCII od 1 do 31 
WHILE @char_id <= 31
BEGIN
	BEGIN TRY
		INSERT INTO #non_printable_list
		SELECT 
			CUSTOMER_NAME AS CUSTOMER_NAME_ORIGIN
			, REPLACE(CUSTOMER_NAME, CHAR(@char_id), '') AS CUSTOMER_NAME_FIXED
			, CONCAT('CHAR(', @char_id, ')') AS NON_PRINTABLE_CHAR
			, CASE WHEN CUSTOMER_NAME LIKE('%' +  CHAR(@char_id) + '%') THEN 'CUSTOMER_NAME'
				WHEN CITY LIKE('%' +  CHAR(@char_id) + '%') THEN 'CITY'
				WHEN ADDRESS LIKE('%' +  CHAR(@char_id) + '%') THEN 'ADDRESS'
				WHEN COUNTRY LIKE('%' +  CHAR(@char_id) + '%') THEN 'COUNTRY'
			ELSE 'OTHER' END AS COLUMN_NAME
		FROM dbo.CUSTOMERS WITH(NOLOCK)
		WHERE 
			CUSTOMER_NAME LIKE('%' +  CHAR(@char_id) + '%')
			OR CITY LIKE('%' +  CHAR(@char_id) + '%')
			OR ADDRESS LIKE('%' +  CHAR(@char_id) + '%')
			OR COUNTRY LIKE('%' +  CHAR(@char_id) + '%')

		SET @char_id = @char_id + 1
	END TRY
	BEGIN CATCH
		SET @char_id = @char_id + 1
		IF @char_id > 31
		BEGIN
			BREAK
		END
	END CATCH

END -- END WHILE

-- obsługa znaku 127 (delete control character)
INSERT INTO #non_printable_list
SELECT 
	CUSTOMER_NAME AS CUSTOMER_NAME_ORIGIN
	, REPLACE(CUSTOMER_NAME, CHAR(127), '') AS CUSTOMER_NAME_FIXED
	, CONCAT('CHAR(', 127, ')') AS NON_PRINTABLE_CHAR
	, CASE WHEN CUSTOMER_NAME LIKE('%' +  CHAR(127) + '%') THEN 'CUSTOMER_NAME'
		WHEN CITY LIKE('%' +  CHAR(127) + '%') THEN 'CITY'
		WHEN ADDRESS LIKE('%' +  CHAR(127) + '%') THEN 'ADDRESS'
		WHEN COUNTRY LIKE('%' +  CHAR(127) + '%') THEN 'COUNTRY'
	ELSE 'OTHER' END AS COLUMN_NAME
FROM dbo.CUSTOMERS WITH(NOLOCK)
WHERE 
	CUSTOMER_NAME LIKE('%' +  CHAR(127) + '%')
	OR CITY LIKE('%' +  CHAR(127) + '%')
	OR ADDRESS LIKE('%' +  CHAR(127) + '%')
	OR COUNTRY LIKE('%' +  CHAR(127) + '%')


SELECT * FROM #non_printable_list

Posts created 14

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Related Posts

Begin typing your search term above and press enter to search. Press ESC to cancel.

Back To Top