{{{#!markdown ì‚¬ì „ì ì˜ë¯¸ëŠ” ë‘ ë°©í–¥ìœ¼ë¡œ 움ì§ì¼ 수 있는 ê²ƒì„ ë§í•œë‹¤. 여기서는 í…ìŠ¤íŠ¸ì˜ Bidirectionalì— ëŒ€í•´ 알아본다. ## Bidirectional text í…스트ì—ì„œ Bidirectionalì€ í•˜ë‚˜ì˜ í…스트가 ë‘ ê°€ì§€ ë°©í–¥ì„±ì„ ê°€ì§€ëŠ” ê²ƒì„ ë§í•œë‹¤. í…스트 방향성ì´ëž€ right-to-left, left-to-rightê³¼ ê°™ì´ ë¬¸ìž¥ì„ ì½ê³ 쓰는 ë°©í–¥ì„ ë§í•œë‹¤. Bidirectionalì€ ë˜í•œ ìš°ê²½ì‹ ë°°ì—´(Boustrophedon; ê° ì¤„ë§ˆë‹¤ í…스트 ë°©í–¥ì„±ì„ ë°”ê¾¼ë‹¤.)ì„ ê°€ë¦¬í‚¤ëŠ”ë° ì“°ì´ê¸°ë„ 한다. <br />  <ìš°ê²½ì‹ ë¬¸ìž¥ ë°°ì—´, ê³ ëŒ€ ê·¸ë¦¬ìŠ¤ì–´ì˜ ì˜ˆ> __boustrophedonically__: í•œ ë°©í–¥(수í‰)으로 시작해서 ì¤„ì˜ ëì— ì´ë¥´ë©´ ë‹¤ìŒ ì¤„ 부터는 ë°©í–¥ì„ ë°˜ëŒ€ë¡œ 바꾼다. 소가 ë°ì„ 가는 모습 ê°™ë‹¤ê³ í•˜ì—¬ ì¼ë³¸ì—ì„œ ìš°ê²½ì‹(牛耕å¼)ì´ë¼ëŠ” ë§ì„ 붙였다. 그리스 ì•ŒíŒŒë²³ì€ ì ì°¨ LTR íŒ¨í„´ì´ ì •ì°©í•˜ê²Œ ë˜ì—ˆë‹¤. í•œ 편, ì•„ëžì–´ì™€ 히브리어는 RTLì„ ì‚¬ìš©í•˜ê²Œ ë˜ì—ˆë‹¤.  <출처: 위키백과, ì„¸ê³„ì˜ í…스트 방향성> ## 컴퓨터 í”„ë¡œê·¸ëž¨ì˜ ê²½ìš° ë§Žì€ ì»´í“¨í„° í”„ë¡œê·¸ëž¨ì€ Bidirectional í…스트를 ì •í™•ížˆ ë³´ì—¬ì£¼ëŠ”ë° ì‹¤íŒ¨í•œë‹¤. 예를 들어, 히브리어 ì´ë¦„ Sarah (שרה) ì˜ ì² ìžëŠ”, sin (ש) (가장 ì˜¤ë¥¸ìª½ì— ë‚˜íƒ€ë‚œë‹¤.), ê·¸ë¦¬ê³ resh (ר), 마지막으로 heh (×”) (가장 ì™¼ìª½ì— ë‚˜íƒ€ë‚˜ì•¼ 한다.)ê°€ ëœë‹¤. 하지만 ì–´ë–¤ 프로그램ì—서는 ì´ ížˆë¸Œë¦¬ì–´ í…스트를 ì • 반대로 보여줄 수 있다. ## Bidirectional 문장 ì§€ì› Bidirectional 문장 지ì›ì€ 컴퓨터ì—ì„œ Bidirectional text를 ì •í™•ížˆ 보여주기 위한 기능ì´ë‹¤. ì´ê²ƒì€ 종종 "BiDi" ë˜ëŠ” "bidi"ë¡œ 줄여 ë§í•˜ê¸°ë„ 한다. 초기 컴퓨터는 ì˜¤ì§ í•œ 가지 쓰기 체계를 지ì›í•˜ë„ë¡(ì¼ë°˜ì 으로 ì˜¤ì§ ë¼í‹´ ì•ŒíŒŒë²³ì˜ left-to-right 기반으로) ì„¤ì •ë˜ì—ˆë‹¤. 새로운 문ìžì…‹ê³¼ ë¬¸ìž ì¸ì½”ë”©ì´ ì¶”ê°€ë˜ë©´ì„œ 다른 ì–¸ì–´ì˜ left-to-right ë¬¸ìž¥ì´ ì§€ì›ë˜ì—ˆì§€ë§Œ, ì•„ëžì–´ë‚˜ 히브리어와 ê°™ì€ right-to-left ë¬¸ìž¥ì„ ì§€ì›í•˜ëŠ” ê²ƒì€ ì‰½ì§€ ì•Šì€ ì¼ì´ì—ˆê³ , ë‘ ê°€ì§€ë¥¼ 섞는 ê²ƒì€ ì‹¤ìš©ì ì´ì§€ë„ 않았다. Right-to-left 문장 지ì›ì€ ë¬¸ìž ì•ˆì— ì½ê¸° 쓰기 순서를 ì €ìž¥í•˜ëŠ” ISO/IEC 8859-6 ê³¼ ISO/IEC 8859-8 ê°™ì€ ì¸ì½”딩ì—ì„œ 소개ë˜ì—ˆë‹¤. ì´ê²ƒì€ 간단하게 left-to-right 표시 ë°©í–¥ì„ ë°˜ëŒ€ë¡œ 바꿀 수 있었지만, ëŒ€ì‹ left-to-right ë¬¸ìž¥ì„ ì •í™•ížˆ 보여주는 ëŠ¥ë ¥ì„ í¬ìƒí•˜ê²Œ ë˜ì—ˆë‹¤. Bidirectional 문장 지ì›ìœ¼ë¡œ, 다른 ë¬¸ìž¥ì´ ê°™ì€ íŽ˜ì´ì§€ì— ìžˆì–´ë„ ì“°ê¸° ë°©í–¥ì„ ê³ ë ¤í•˜ì§€ ì•Šê³ ë¬¸ìž¥ì„ ì„žëŠ” ê²ƒì´ ê°€ëŠ¥í•´ì¡Œë‹¤. 특히, ìœ ë‹ˆì½”ë“œ í‘œì¤€ì€ ì–´ë–»ê²Œ RTLê³¼ LTRì´ ì„žì¸ ë¬¸ìž¥ì„ ì¸ì½”ë”©í•˜ê³ ë³´ì—¬ì£¼ëŠ” ë°©ë²•ì— ëŒ€í•œ ìžì„¸í•œ 규칙과 함께 ì™„ì „í•œ BiDi 지ì›ì„ 위한 ê¸°ë°˜ì„ ì œê³µí•œë‹¤. ## ìœ ë‹ˆì½”ë“œ BiDi ì§€ì› ìœ ë‹ˆì½”ë“œ í‘œì¤€ì€ '논리ì '으로 ì •ë ¬ëœ ë¬¸ìžë“¤ì„ 호출한다. 즉, 'ì‹œê°ì '으로 나타나는 순서와는 대조ì ì¸ í•´ì„ë ì˜ˆì •ì˜ ìˆœì„œê°€ ëœë‹¤. ê·¸ë¦¬ê³ , bidi 지ì›ì„ ì œê³µí•˜ê¸° 위해, ìœ ë‹ˆì½”ë“œëŠ” 논리ì ë¬¸ìž ìˆœì„œë¥¼ 어떻게 ì •í™•í•œ ì‹œê°ì 표현으로 ë³€í™˜í• ìˆ˜ 있는지 ì•Œê³ ë¦¬ì¦˜ì„ ê·œì •í–ˆë‹¤. ì´ë¥¼ 위해, ìœ ë‹ˆì½”ë“œ ì¸ì½”딩 í‘œì¤€ì€ ëª¨ë“ ë¬¸ìžë¥¼ 네 가지 타입( 'strong', 'weak, 'neutral', ê·¸ë¦¬ê³ 'explicit') 중 하나로 나눈다. ### ê°•í•œ 문ìž(strong characters) ê°•í•œ 문ìžëŠ” 명백한 ë°©í–¥ì„±ì„ ê°€ì§„ 것들ì´ë‹¤. ì´ ë¬¸ìž íƒ€ìž…ì˜ ì˜ˆëŠ” ëŒ€ë¶€ë¶„ì˜ ì•ŒíŒŒë²³ 문ìž, ìŒì ˆ 문ìž(ì¼ë³¸ì–´ 가나가 대표ì ), í•œìž, 비 ìœ ëŸ½ ë˜ëŠ” 비 ì•„ë¼ë¹„ì•„ 숫ìž, 문장 부호(ê·¸ ë¬¸ìž¥ì— ê³ ìœ í•œ)를 í¬í•¨í•œë‹¤. ### 약한 문ìž(weak characters) 약한 문ìžëŠ” ì• ë§¤í•œ ë°©í–¥ì„±ì„ ê°€ì§„ 것들ì´ë‹¤. ì´ ë¬¸ìž íƒ€ìž…ì˜ ì˜ˆëŠ” ìœ ëŸ½ ìˆ«ìž ë™ ì•„ë¼ë¹„ì•„-ì¸ë„ 숫ìž, 수학 기호, 통화 기호, ë§Žì€ ë¬¸ìž¥ì—ì„œ ì¼ë°˜ì 으로 사용ë˜ëŠ” 문장 부호(ì½œë¡ , 콤마, 마침표 등) ë“±ì€ ì´ íƒ€ìž…ìœ¼ë¡œ 떨어진다. ### 중립 문ìž(neutral characters) 중립 문ìžëŠ” ë¬¸ë§¥ì´ ì—†ìœ¼ë©´ ë°©í–¥ì„±ì„ í™•ì •í• ìˆ˜ 없는 문ìžë“¤ì´ë‹¤. 예를 들어 ë‹¨ë½ êµ¬ë¶„, íƒ, 스페ì´ìŠ¤ ë“±ì„ í¬í•¨í•œë‹¤. ### 명시ì í¬ë§·íŒ…(explicit formatting) 명시ì í¬ë§·íŒ… 문ìž("방향성 í¬ë§·íŒ… 문ìž"ë¼ê³ ë¶ˆë¦¬ê¸°ë„ í•œë‹¤.)는, ìœ ë‹ˆì½”ë“œ ì•Œê³ ë¦¬ì¦˜ì˜ ê¸°ë³¸ ë™ìž‘ì—ì„œ ì§ì ‘ 순서를 ìˆ˜ì •í• ìˆ˜ 있는 문ìžë‹¤. ì´ ë¬¸ìžë“¤ì€ "marks", "embeddings", "isolates", ê·¸ë¦¬ê³ "overrides"ë¡œ 세분화ëœë‹¤. ì´ ë¬¸ìžë“¤ì˜ 효과는 ë‹¨ë½ êµ¬ë¶„ì´ ë‚˜ì˜¤ê±°ë‚˜ "pop" 문ìžê°€ 나올 때까지 지ì†ëœë‹¤. #### marks 약한 문ìžê°€ 다른 약한 ë¬¸ìž ë’¤ì— ì˜¤ëŠ” 경우, ì•Œê³ ë¦¬ì¦˜ì€ ì²«ë²ˆì§¸ ê°•í•œ ì´ì›ƒ 문ìžë¥¼ 본다. 때때로 ì´ê²ƒì€ ì˜ë„하지 ì•Šì€ í‘œì‹œ 오류로 ì´ì–´ì§„다. ì´ëŸ¬í•œ 오류는 "ì˜ì‚¬ ê°•í•œ(pseudo-string)" 문ìžë¡œ ìˆ˜ì •ë 수 있는ë°, ì´ëŸ° ìœ ë‹ˆì½”ë“œ ì œì–´ 문ìžë¥¼ "mark" ë¼ê³ 부른다. ë§ˆí¬ U+200E left-to-right mark, U+200F right-to-left mark 는 약한 문ìžê°€ 쓰기 ë°©í–¥ì„ ìƒì†ë°›ëŠ” ìœ„ì¹˜ì— ì‚½ìž…ë 수 있다. #### embeddings "embedding" 방향성 í¬ë§·íŒ… 문ìžëŠ” 명시ì í¬ë§·íŒ…ì˜ ê³ ì „ì ì¸ ìœ ë‹ˆì½”ë“œ ë°©ì‹ì´ë©°, ìœ ë‹ˆì½”ë“œ 6.3 처럼, ëŒ€ì‹ "isolates" 를 ê¶Œìž¥í•˜ê³ ìžˆë‹¤. í…스트 ì¼ë¶€ì˜ "embeddings" ì‹ í˜¸ëŠ” ë°©í–¥ì„±ì´ ë‹¤ë¥¸ 것으로 간주ëœë‹¤. embedding í¬ë§·íŒ… 범위 ë‚´ì˜ ë¬¸ìžëŠ” ì£¼ìœ„ì˜ í…스트와 ë…립ì ì´ì§€ 않다. ë˜í•œ, embedding ëœ ë¬¸ìžëŠ” ë¬¸ìž ë°”ê¹¥ ìˆœì„œì— ì˜í–¥ì„ 줄 수 있다. ìœ ë‹ˆì½”ë“œ 6.3ì€ ë°©í–¥ì„± embeddingì€ ëŒ€ê°œ ì£¼ìœ„ì— ë„ˆë¬´ ê°•í•œ 효과를 ê°€ì ¸ì˜¤ë©° ë”°ë¼ì„œ í•„ìš” ì´ìƒìœ¼ë¡œ 사용하기 ì–´ë µë‹¤ëŠ” ê²ƒì„ ë°í˜€ëƒˆë‹¤. #### isolates "isolate" 방향성 í¬ë§·íŒ… 문ìžëŠ” í…스트 ì¼ë¶€ì˜ ë°©í–¥ì„±ì„ ì£¼ìœ„ì™€ 분리ë˜ë©´ì„œ 다르게 처리ë˜ë„ë¡ ì‹ í˜¸í•œë‹¤. ìœ ë‹ˆì½”ë“œ 6.3ì€ ìƒˆ 문서는 방향성 embedding ëŒ€ì‹ ì´ê²ƒì„ 사용하ë„ë¡ ê¶Œìž¥í•œë‹¤. "embedding" 방향성 í¬ë§·íŒ… 문ìžì™€ëŠ” 달리 "isolate" 문ìžëŠ” í…스트 범위 ë°”ê¹¥ì˜ ìˆœì„œì— ì˜í–¥ì„ 주지 않는다. #### overrides "override" 방향성 í¬ë§·íŒ… 문ìžëŠ” 부분 ìˆ«ìž ê°™ì€ íŠ¹ë³„í•œ 경우를 허용한다(예를 들어 ê°•ì œë¡œ ì˜ì–´ 숫ìžì™€ 히브리어 문ìžë¥¼ 혼합하여 RTLë¡œ 쓰게 ë§Œë“ ë‹¤.). ê·¸ë¦¬ê³ ê°€ëŠ¥í•˜ë©´ 피하는 ê²ƒì´ ì¢‹ë‹¤. "overrides"는 다른 í¬ë§·íŒ… ì•ˆìª½ì— ì¤‘ì²©ë 수 있다. #### pops "pop" 방향성 í¬ë§·íŒ… 문ìžëŠ” 가장 최근 "embeddings", "overrides", "isolates"ì˜ íš¨ê³¼ë¥¼ 종료한다. #### runs ì•Œê³ ë¦¬ì¦˜ì—ì„œ, ì¸ì ‘í•œ ê°•í•œ 문ìžë“¤ì˜ ê° ì—°ì†ì„ "run"ì´ë¼ê³ 부른다. 약한 문ìžê°€ ë‘ ê°™ì€ ë°©í–¥ì˜ ê°•í•œ 문ìžì˜ 사ì´ì— 위치해 있으면 ê·¸ ë°©í–¥ì„ ìƒì†ë°›ëŠ”다. 약한 문ìžê°€ ë‘ ë‹¤ë¥¸ ë°©í–¥ì˜ ê°•í•œ 문ìžì˜ 사ì´ì— 위치해 있으면 주 ë¬¸ë§¥ì˜ ë°©í–¥(LTR ë¬¸ì„œì˜ ë¬¸ìžëŠ” LTRì´ ë˜ê³ , RTL ë¬¸ì„œì˜ ë¬¸ìžëŠ” RTLì´ ëœë‹¤.)ì„ ìƒì†ë°›ëŠ”다. ### Table of BiDi-types http://www.unicode.org/reports/tr9/#Directional_Formatting_Codes 참조 ## 참조 - http://en.wikipedia.org/wiki/Bi-directional_text - http://www.unicode.org/reports/tr9/ UNICODE BIDIRECTIONAL ALGORITHM }}}