블로그나 게시판 에디터에 URL이나 도메인 같은 문자열을 붙여 넣으면 저절로 링크가 걸리는 경우가 많습니다. 링크를 걸고 싶지 않은데 에디터가 계속 바꿔 버리면, 글자 사이에 공백을 넣어 주소처럼 보이지 않게 만드는 게 제일 간단한 우회 방법입니다. 손으로 한 글자씩 띄우기는 번거로워서 클립보드 내용을 바로 바꿔 주는 코드를 만들어 두고 썼습니다.
Dim charsAsStringArray() As String = Clipboard.GetText.Select(Function(c) c.ToString()).ToArray()
Clipboard.SetText(Join(charsAsStringArray))
실행 결과는 이렇습니다.
ex:) charsAsStringArray
out:) c h a r s A s S t r i n g A r r a y
어떻게 동작하나
Clipboard.GetText로 가져온 문자열은 Char의 나열이라 LINQ Select를 바로 쓸 수 있습니다. 각 Char를 ToString()으로 한 글자짜리 문자열로 바꿔 배열로 만든 다음, Join으로 다시 합칩니다. 여기서 쓴 Join은 Microsoft.VisualBasic의 함수이고, 구분자를 생략하면 공백 한 칸(" ")이 기본값입니다. 그래서 따로 구분자를 주지 않아도 글자 사이에 공백이 들어갑니다. 결과는 다시 Clipboard.SetText로 클립보드에 넣으니, 복사 → 실행 → 붙여넣기 순서로 쓰면 됩니다.
같은 일을 .NET 표준 방식으로 쓰면 String.Join(" ", text.ToCharArray()) 한 줄로도 됩니다. 구분자를 공백 대신 다른 문자(예: 폭 없는 공백)로 바꾸고 싶을 때는 이쪽이 더 눈에 잘 들어옵니다.
쓸 때 주의할 점
Clipboard 클래스는 WinForms의 UI 스레드(STA)에서 호출해야 합니다. 버튼 클릭 이벤트 안에서는 문제없지만, 백그라운드 스레드나 콘솔 앱에서 그냥 부르면 예외가 납니다. 그리고 클립보드가 비어 있거나 텍스트가 아닌 내용(이미지 등)이 들어 있으면 GetText가 빈 문자열을 돌려주므로, 결과도 빈 값이 됩니다.
글자 단위로 쪼개기 때문에 줄바꿈 문자(vbCr, vbLf)도 각각 한 글자로 취급되어 그 사이에도 공백이 들어갑니다. 여러 줄을 한 번에 바꾸면 줄 끝 모양이 조금 달라질 수 있으니 한 줄짜리 주소에 쓰는 게 깔끔합니다. 이모지처럼 Char 두 개로 이뤄진 문자는 중간이 갈라져 깨지니 이런 문자가 섞인 문장에는 맞지 않습니다.
응용하자면 단축키 프로그램이나 트레이 아이콘 유틸에 붙여 두고, 블로그 글을 쓰다가 링크가 걸리면 안 되는 문자열만 골라 변환하는 식으로 쓰면 편합니다.
빈 클립보드에서 실행하면 예외가 난다
위 코드는 클립보드가 비어 있을 때 결과도 빈 문자열이 되는데, Clipboard.SetText 는 빈 문자열을 넘기면 ArgumentNullException 을 던집니다. 버튼에 붙여 두고 실수로 아무것도 복사하지 않은 채 누르면 프로그램이 멈추니, Clipboard.ContainsText() 로 먼저 확인하거나 결과가 비어 있으면 SetText 를 건너뛰게 하는 게 좋습니다.
원래 문자열에 있던 공백도 한 글자로 취급된다는 점도 알아 두면 좋습니다. a b 를 넣으면 a, 공백, b 사이사이에 공백이 하나씩 더 들어가서 a b 처럼 공백 세 칸이 됩니다. 문장보다는 띄어쓰기가 없는 주소나 아이디에 맞는 방식입니다.
눈에 안 보이게 끊고 싶을 때
공백 대신 폭 없는 공백(U+200B)을 넣으면 화면에서는 원래 주소처럼 붙어 보이면서도 에디터가 주소로 인식하지 못하는 경우가 있습니다. 이모지 깨짐까지 피하려면 Char 단위 대신 텍스트 요소 단위로 나누면 됩니다.
If Clipboard.ContainsText() Then
Dim s As String = Clipboard.GetText()
Dim parts As New List(Of String)
Dim en = Globalization.StringInfo.GetTextElementEnumerator(s)
While en.MoveNext()
parts.Add(en.GetTextElement())
End While
Clipboard.SetText(String.Join(ChrW(&H200B), parts))
End If
다만 폭 없는 공백은 보이지 않을 뿐 문자로 남아 있어서, 독자가 그 주소를 복사해 브라우저에 붙이면 열리지 않습니다. 링크를 막는 게 목적일 때만 쓰고, 독자가 그대로 복사해 써야 하는 문자열이라면 일반 공백이 오히려 정직합니다. 에디터마다 이 문자를 지워 버리기도 하니 발행 전에 한 번 확인해 보세요.