Microsoft MVP성태의 닷넷 이야기
글쓴 사람
정성태 (seongtaejeong at gmail.com)
홈페이지
첨부 파일
 

(시리즈 글이 12개 있습니다.)
.NET Framework: 326. 유니코드와 한글 - 유니코드와 닷넷을 이용한 한글 처리
; https://www.sysnet.pe.kr/2/0/1294

.NET Framework: 411. 유니코드의 "compatibility character"가 뭘까요?
; https://www.sysnet.pe.kr/2/0/1607

.NET Framework: 429. C# - 유니코드 한글 문자열을 ks_c_5601-1987로 변환하는 방법
; https://www.sysnet.pe.kr/2/0/1657

개발 환경 구성: 230. 유니코드의 Surrogate Pair, Supplementary Characters가 뭘까요?
; https://www.sysnet.pe.kr/2/0/1710

.NET Framework: 450. 영문 윈도우에서 C# 콘솔 프로그램의 유니코드 출력 방법
; https://www.sysnet.pe.kr/2/0/1712

.NET Framework: 794. C# - 같은 모양, 다른 값의 한글 자음을 비교하는 호환 분해
; https://www.sysnet.pe.kr/2/0/11710

개발 환경 구성: 407. 유니코드와 한글 - "Hangul Compatibility Jamo"
; https://www.sysnet.pe.kr/2/0/11724

Windows: 176. Raymond Chen이 한글날에 밝히는 윈도우의 한글 자모 분리 현상
; https://www.sysnet.pe.kr/2/0/12369

닷넷: 2307. C# - 윈도우에서 한글(및 유니코드)을 포함한 콘솔 프로그램을 컴파일 및 실행하는 방법
; https://www.sysnet.pe.kr/2/0/13794

개발 환경 구성: 731. 유니코드 - 출력 예시 및 폰트 찾기
; https://www.sysnet.pe.kr/2/0/13798

개발 환경 구성: 732. 모바일 웹 브라우저에서 유니코드 문자가 표시되지 않는 경우
; https://www.sysnet.pe.kr/2/0/13799

닷넷: 2310. .NET의 Rune 타입과 emoji 표현
; https://www.sysnet.pe.kr/2/0/13813




모바일 웹 브라우저에서 유니코드 문자가 표시되지 않는 경우

얼마 전에 쓴 유니코드 관련 글을,

C++ - 문자열의 대소문자를 변환하는 transform + std::tolower/toupper 방식의 문제점
; https://www.sysnet.pe.kr/2/0/13797

우연히 모바일 웹 브라우저로 봤는데, Chrome이든 Edge든 유니코드 문자가 모두 깨져 나왔습니다. 예를 들어 아래의 문자는,

𐲀 (U+10C80 코드 - OLD HUNGARIAN CAPITAL LETTER)

PC용 웹 브라우저에서는 잘 보이지만, 모바일 브라우저에서는 이상한 글자로 보일 것입니다. (현재 이 게시물에서는 아래의 내용에 따라 잘 보이도록 조치를 취했습니다. ^^)

이걸 보이게 하려면, 일단 HTML 문서 자체는 UTF-8 인코딩을 따르고 있으니 그건 문제가 아니고, 바로 폰트가 있어야 합니다. ^^

자, 그럼 위의 문서라면 "OLD HUNGARIAN" 문자를 보여줄 수 있는 폰트를 구해야 하고, 그 방법은 이전에 설명한 방법을 따르면 됩니다.

사실 여기에는 2가지 방법이 있는데요, 클라이언트가 폰트를 설치하든지, 서버 측에서 그 폰트를 구할 경로를 알려주는 것입니다. 다행히 "OLD HUNGARIAN" 문자를 보여줄 수 있는 폰트는 공개 폰트 라이선스(SIL OPEN FONT LICENSE)로 제공하고 있으므로,

Noto Sans Old Hungarian
; https://fonts.google.com/noto/specimen/Noto+Sans+Old+Hungarian

위의 문서에 나온 방법에 따라 HTML 페이지에 다음과 같이 폰트 파일을 구할 경로를 첨부할 수 있고,

<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Noto+Sans+Old+Hungarian&display=swap" rel="stylesheet">

저 웹 페이지를 방문한 클라이언트 측 웹 브라우저는 (시스템에 해당 폰트가 설치돼 있지 않다면) 런타임에 폰트를 다운로드해 사용할 수 있습니다.

일단, 이렇게 폰트가 마련됐으면 이후에는 웹 문서에 해당 폰트를 사용하도록 font-family 속성을 지정하면 됩니다.

<style>
    body {
        font-family: "Noto Sans Old Hungarian", sans-serif;
    }
</style>

그럼, 문서에 포함된 OLD HUNGARIAN 문자를,

<body>
    '𐲀' 문자
    𐲀
</body>

모바일 환경에서도 정상적으로 볼 수 있게 됩니다.




방법은 알았지만, 사실 이게 현실적으로 지원이 쉽지 않습니다. 정적 HTML 페이지인 경우라면 유니코드가 사용된 유형에 따라 필요한 폰트를 <link />로 직접 기입하면 그만인데요, 동적 페이지라면 살짝 상황이 달라집니다.

가령, 게시판에 올라오는 글 중에는 특정 폰트가 설치되었을 때만 보이는 유니코드 텍스트를 가지는 경우일 텐데요, 해당 게시물을 분석해 그에 맞는 폰트를 추가하도록 <link /> 태그를 추가하는 것이 녹록치 않습니다. 그렇다고, 대부분의 게시물에서 쓰지도 않을 유니코드 글자들을 위해 모든 폰트를 미리 <link />로 추가해 두는 것도 바람직하지 않습니다.

어쨌든, 제 경우에는 어차피 개인적으로 만든 블로그 게시판이어서 임의로 맞춰주었는데요, 그래서 아래의 게시물이 이제는 모바일 브라우저에서도 𐲀 글자가 깨지지 않고 잘 보이게 만들었습니다. ^^
C++ - 문자열의 대소문자를 변환하는 transform + std::tolower/toupper 방식의 문제점
; https://www.sysnet.pe.kr/2/0/13797




[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]







[최초 등록일: ]
[최종 수정일: 11/2/2024]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 




... 121  122  123  [124]  125  126  127  128  129  130  131  132  133  134  135  ...
NoWriterDateCnt.TitleFile(s)
10822정성태7/7/201527293오류 유형: 299. The 'Visual C++ Project System Package' package did not load correctly.
10821정성태7/7/201519538오류 유형: 298. Unable to start debugging on the web server. IIS does not list a web site that matches the launched URL.
10820정성태7/7/201525507오류 유형: 297. HTTP Error 503. The service is unavailable. - 두 번째
10819정성태7/2/201528948오류 유형: 296. SQL Server Express 시작 오류 - error code 3417
10818정성태7/1/201527763오류 유형: 295. HTTP Error 503. The service is unavailable. [1]
10817정성태6/29/201531470.NET Framework: 523. C# 람다(Lambda)에서 변수 캡처 방식 [3]
10816정성태6/25/201527808.NET Framework: 522. 닷넷의 어셈블리 서명 데이터 확인 방법파일 다운로드1
10815정성태6/23/201525655Graphics: 1. 자네 나와 함께... UNITY 하지 않겠는가! [4]
10814정성태6/22/201523500.NET Framework: 521. Roslyn을 이용해 C# 문법 변형하기 (2) [5]
10813정성태6/21/201525239.NET Framework: 520. Roslyn을 이용해 C# 문법 변형하기 (1)
10812정성태6/20/201526358.NET Framework: 519. C# 6.0 오픈 소스 컴파일러 Roslyn - 빌드 및 테스트 방법 [1]
10811정성태6/20/201523175오류 유형: 294. OpenAuth 사용 시 System.Data.SqlClient.SqlException 예외가 Output 창에 출력되는 문제
10810정성태6/18/201522165개발 환경 구성: 270. Visual Studio에서 github 오픈 소스를 fork해서 테스트하는 방법 [1]
10809정성태6/18/201520143.NET Framework: 518. AllowPartiallyTrustedCallers 특성이 적용된 GAC 어셈블리에서 DynamicMethod의 calli 명령어 사용파일 다운로드1
10808정성태6/17/201522495.NET Framework: 517. calli IL 호출이 DllImport 호출보다 빠를까요? [1]파일 다운로드1
10807정성태6/16/201523570.NET Framework: 516. Microsoft.AspNet.Membership.OpenAuth 사용 시 "Local Database Runtime error occurred" 오류
10806정성태6/16/201541426.NET Framework: 515. OpenAuth.VerifyAuthentication 호출 시 The remote server returned an error: (400) Bad Request
10805정성태6/15/201522760Java: 17. 자바의 재미있는 상수 처리 방식
10804정성태6/10/201522434.NET Framework: 514. .NET CLR2 보안 모델에서의 APTCA 역할 (2)파일 다운로드1
10803정성태6/2/201524386.NET Framework: 513. UWP(Universal Windows Platform) 응용 프로그램의 새로운 라이브러리 버전 관리 해법 [2]
10802정성태6/2/201524430개발 환경 구성: 269. 마이크로소프트 온라인 강좌 소개 - Azure VPN 구성 방법 [1]
10801정성태5/31/201528942.NET Framework: 512. async/await 사용 시 hang 문제가 발생하는 경우 - 두 번째 이야기 [3]
10800정성태5/29/201524411개발 환경 구성: 268. 소개 - 프로세싱(https://processing.org/)
10799정성태5/29/201522171사물인터넷: 3. 책 소개 - 라즈베리 파이로 구현하는 사물 인터넷 프로젝트 [1]
10798정성태5/26/201521957기타: 53. 2015년 6월 10일 밤 10시 온라인 세미나 - 새로운 Windows 10 App을 개발하는 방법
10797정성태5/23/201521615VC++: 91. 자식 스레드에 자동 상속되는 TEB의 SubProcessTag 필드파일 다운로드1
... 121  122  123  [124]  125  126  127  128  129  130  131  132  133  134  135  ...