{"id":27990,"date":"2025-08-04T10:52:20","date_gmt":"2025-08-04T03:52:20","guid":{"rendered":"https:\/\/dps.media\/?page_id=27990"},"modified":"2025-08-04T11:07:40","modified_gmt":"2025-08-04T04:07:40","slug":"text-conversion-tool","status":"publish","type":"page","link":"https:\/\/dps.media\/en\/text-conversion-tool\/","title":{"rendered":"Text Conversion Tool"},"content":{"rendered":"<?xml encoding=\"utf-8\" ?><div id=\"text-converter-tool\">\n<style>\n@import url('https:\/\/fonts.googleapis.com\/css2?family=Inter:wght@400;500;600&display=swap');\n\n#text-converter-tool {\n    width: 100%;\n    margin: 20px 0;\n    font-family: 'Inter', 'Segoe UI', 'Arial', sans-serif;\n    font-feature-settings: 'cv02', 'cv03', 'cv04', 'cv11';\n}\n\n#text-converter-tool .converter-card {\n    background: #ffffff;\n    border-radius: 12px;\n    box-shadow: 0 4px 20px rgba(0, 0, 0, 0.08);\n    padding: 32px;\n    border: 1px solid #e5e7eb;\n}\n\n#text-converter-tool .header {\n    text-align: center;\n    margin-bottom: 32px;\n}\n\n#text-converter-tool .header h2 {\n    font-size: 1.875rem;\n    font-weight: 600;\n    color: #151577;\n    margin-bottom: 8px;\n    line-height: 1.2;\n    letter-spacing: -0.025em;\n}\n\n#text-converter-tool .header p {\n    color: #6b7280;\n    font-size: 1rem;\n    line-height: 1.5;\n    font-weight: 400;\n}\n\n#text-converter-tool .input-section {\n    margin-bottom: 24px;\n}\n\n#text-converter-tool .textarea-container {\n    position: relative;\n    margin-bottom: 16px;\n}\n\n#text-converter-tool textarea {\n    width: 100%;\n    min-height: 160px;\n    padding: 16px;\n    border: 2px solid #e5e7eb;\n    border-radius: 8px;\n    font-size: 14px;\n    font-family: 'SF Mono', 'Monaco', 'Cascadia Code', 'Roboto Mono', monospace;\n    resize: vertical;\n    transition: all 0.2s ease;\n    background: #fafafa;\n    line-height: 1.6;\n}\n\n#text-converter-tool textarea:focus {\n    outline: none;\n    border-color: #32b561;\n    background: #ffffff;\n    box-shadow: 0 0 0 3px rgba(50, 181, 97, 0.1);\n}\n\n#text-converter-tool .text-stats {\n    display: flex;\n    gap: 24px;\n    font-size: 13px;\n    color: #6b7280;\n    margin-bottom: 20px;\n    font-weight: 500;\n}\n\n#text-converter-tool .search-replace {\n    display: grid;\n    grid-template-columns: 1fr 1fr auto;\n    gap: 12px;\n    margin-bottom: 24px;\n    align-items: end;\n}\n\n#text-converter-tool .search-replace input {\n    padding: 10px 12px;\n    border: 2px solid #e5e7eb;\n    border-radius: 6px;\n    font-size: 14px;\n    font-weight: 400;\n    transition: border-color 0.2s ease;\n}\n\n#text-converter-tool .search-replace input:focus {\n    outline: none;\n    border-color: #32b561;\n    box-shadow: 0 0 0 3px rgba(50, 181, 97, 0.1);\n}\n\n#text-converter-tool .buttons-grid {\n    display: grid;\n    grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));\n    gap: 12px;\n    margin-bottom: 24px;\n}\n\n#text-converter-tool .case-btn {\n    padding: 12px 16px;\n    border: 2px solid #e5e7eb;\n    border-radius: 8px;\n    font-size: 13px;\n    font-weight: 500;\n    cursor: pointer;\n    transition: all 0.2s ease;\n    background: #ffffff;\n    color: #374151;\n    line-height: 1.4;\n}\n\n#text-converter-tool .case-btn:hover {\n    background: #32b561;\n    color: white;\n    border-color: #32b561;\n    transform: translateY(-1px);\n    box-shadow: 0 4px 12px rgba(50, 181, 97, 0.25);\n}\n\n#text-converter-tool .action-buttons {\n    display: flex;\n    gap: 12px;\n    justify-content: center;\n    flex-wrap: wrap;\n}\n\n#text-converter-tool .action-btn {\n    padding: 12px 20px;\n    border: none;\n    border-radius: 8px;\n    font-size: 14px;\n    font-weight: 500;\n    cursor: pointer;\n    transition: all 0.2s ease;\n    line-height: 1.4;\n}\n\n#text-converter-tool .primary-btn {\n    background: #32b561;\n    color: white;\n    box-shadow: 0 2px 8px rgba(50, 181, 97, 0.2);\n}\n\n#text-converter-tool .primary-btn:hover {\n    background: #2a9954;\n    transform: translateY(-1px);\n    box-shadow: 0 4px 12px rgba(50, 181, 97, 0.3);\n}\n\n#text-converter-tool .secondary-btn {\n    background: #151577;\n    color: white;\n    box-shadow: 0 2px 8px rgba(21, 21, 119, 0.2);\n}\n\n#text-converter-tool .secondary-btn:hover {\n    background: #0f1156;\n    transform: translateY(-1px);\n    box-shadow: 0 4px 12px rgba(21, 21, 119, 0.3);\n}\n\n#text-converter-tool .danger-btn {\n    background: #dc2626;\n    color: white;\n    box-shadow: 0 2px 8px rgba(220, 38, 38, 0.2);\n}\n\n#text-converter-tool .danger-btn:hover {\n    background: #b91c1c;\n    transform: translateY(-1px);\n    box-shadow: 0 4px 12px rgba(220, 38, 38, 0.3);\n}\n\n#text-converter-tool .notification {\n    position: fixed;\n    top: 20px;\n    right: 20px;\n    padding: 12px 20px;\n    background: #32b561;\n    color: white;\n    border-radius: 8px;\n    box-shadow: 0 8px 25px rgba(50, 181, 97, 0.3);\n    transform: translateX(400px);\n    transition: transform 0.3s ease;\n    z-index: 9999;\n    font-size: 14px;\n    font-weight: 500;\n    line-height: 1.4;\n}\n\n#text-converter-tool .notification.show {\n    transform: translateX(0);\n}\n\n#text-converter-tool .notification.error {\n    background: #dc2626;\n    box-shadow: 0 8px 25px rgba(220, 38, 38, 0.3);\n}\n\n@media (max-width: 768px) {\n    #text-converter-tool .converter-card {\n        padding: 24px 20px;\n        margin: 10px;\n    }\n    \n    #text-converter-tool .buttons-grid {\n        grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));\n        gap: 10px;\n    }\n    \n    #text-converter-tool .search-replace {\n        grid-template-columns: 1fr;\n        gap: 10px;\n    }\n    \n    #text-converter-tool .action-buttons {\n        flex-direction: column;\n    }\n    \n    #text-converter-tool .header h2 {\n        font-size: 1.5rem;\n    }\n}\n<\/style>\n\n<div class=\"converter-card\">\n    <div class=\"header\">\n        <h2>Text Conversion Tool<\/h2>\n        <p style=\"text-align: center;\">\n  Convert and process Vietnamese text professionally\n<\/p>\n    <\/div>\n\n    <div class=\"input-section\">\n        <div class=\"textarea-container\">\n            <textarea id=\"textInput\" placeholder=\"Enter your text here...\"><\/textarea>\n        <\/div>\n        <div class=\"text-stats\">\n            <span id=\"charCount\">0 characters<\/span>\n            <span id=\"wordCount\">0 words<\/span>\n            <span id=\"lineCount\">0 lines<\/span>\n        <\/div>\n    <\/div>\n\n    <div class=\"search-replace\">\n        <input type=\"text\" id=\"searchText\" placeholder=\"Search...\">\n        <input type=\"text\" id=\"replaceText\" placeholder=\"Replace with...\">\n        <button class=\"case-btn\" onclick=\"searchAndReplace()\">Find &amp; Replace<\/button>\n    <\/div>\n\n    <div class=\"buttons-grid\">\n        <button class=\"case-btn\" onclick=\"convertCase('sentence')\">Capitalize first letter<\/button>\n        <button class=\"case-btn\" onclick=\"convertCase('lower')\">lowercase<\/button>\n        <button class=\"case-btn\" onclick=\"convertCase('upper')\">UPPERCASE<\/button>\n        <button class=\"case-btn\" onclick=\"convertCase('title')\">Title Case<\/button>\n        <button class=\"case-btn\" onclick=\"removeAccents()\">Remove Vietnamese accents<\/button>\n        <button class=\"case-btn\" onclick=\"removeSpaces()\">Remove spaces<\/button>\n        <button class=\"case-btn\" onclick=\"spaceToUnderscore()\">Replace _ with space<\/button>\n        <button class=\"case-btn\" onclick=\"newlineToComma()\">Newline \u2192 Comma<\/button>\n        <button class=\"case-btn\" onclick=\"commaToNewline()\">Comma \u2192 Newline<\/button>\n        <button class=\"case-btn\" onclick=\"removeEmptyLines()\">Delete blank lines<\/button>\n        <button class=\"case-btn\" onclick=\"textToBinary()\">Convert to Binary<\/button>\n        <button class=\"case-btn\" onclick=\"textToHex()\">Convert to Hex<\/button>\n        <button class=\"case-btn\" onclick=\"binaryToText()\">Binary \u2192 Text<\/button>\n        <button class=\"case-btn\" onclick=\"hexToText()\">Hex \u2192 Text<\/button>\n    <\/div>\n\n    <div class=\"action-buttons\">\n        <button class=\"action-btn secondary-btn\" onclick=\"undoAction()\">\u21b6 Undo<\/button>\n        <button class=\"action-btn primary-btn\" onclick=\"copyToClipboard()\">\ud83d\udccb Copy<\/button>\n        <button class=\"action-btn secondary-btn\" onclick=\"downloadText()\">\ud83d\udce5 Download<\/button>\n        <button class=\"action-btn danger-btn\" onclick=\"clearText()\">\ud83d\uddd1\ufe0f Clear all<\/button>\n    <\/div>\n<\/div>\n\n<div class=\"notification\" id=\"notification\"><\/div>\n\n<script>\n(function() {\n    const textInput = document.getElementById('textInput');\n    const charCount = document.getElementById('charCount');\n    const wordCount = document.getElementById('wordCount');\n    const lineCount = document.getElementById('lineCount');\n    \n    \/\/ L\u01b0u tr\u1eef l\u1ecbch s\u1eed \u0111\u1ec3 undo\n    let history = [];\n    let currentStep = -1;\n\n    \/\/ C\u1eadp nh\u1eadt th\u1ed1ng k\u00ea v\u0103n b\u1ea3n\n    function updateStats() {\n        const text = textInput.value;\n        const chars = text.length;\n        const words = text.trim() ? text.trim().split(\/\\s+\/).length : 0;\n        const lines = text.split('\\n').length;\n        \n        charCount.textContent = `${chars} k\u00fd t\u1ef1`;\n        wordCount.textContent = `${words} t\u1eeb`;\n        lineCount.textContent = `${lines} d\u00f2ng`;\n    }\n\n    textInput.addEventListener('input', updateStats);\n\n    \/\/ L\u01b0u tr\u1ea1ng th\u00e1i \u0111\u1ec3 undo\n    function saveState() {\n        const currentText = textInput.value;\n        \/\/ X\u00f3a c\u00e1c b\u01b0\u1edbc sau current step n\u1ebfu c\u00f3\n        history = history.slice(0, currentStep + 1);\n        history.push(currentText);\n        currentStep++;\n        \/\/ Gi\u1edbi h\u1ea1n l\u1ecbch s\u1eed t\u1ed1i \u0111a 20 b\u01b0\u1edbc\n        if (history.length > 20) {\n            history.shift();\n            currentStep--;\n        }\n    }\n\n    \/\/ Kh\u1edfi t\u1ea1o v\u1edbi tr\u1ea1ng th\u00e1i r\u1ed7ng\n    saveState();\n\n    \/\/ B\u1ea3ng chuy\u1ec3n \u0111\u1ed5i d\u1ea5u ti\u1ebfng Vi\u1ec7t\n    const vietnameseMap = {\n        '\u00e0': 'a', '\u00e1': 'a', '\u1ea1': 'a', '\u1ea3': 'a', '\u00e3': 'a', '\u00e2': 'a', '\u1ea7': 'a', '\u1ea5': 'a', '\u1ead': 'a', '\u1ea9': 'a', '\u1eab': 'a', '\u0103': 'a', '\u1eb1': 'a', '\u1eaf': 'a', '\u1eb7': 'a', '\u1eb3': 'a', '\u1eb5': 'a',\n        '\u00e8': 'e', '\u00e9': 'e', '\u1eb9': 'e', '\u1ebb': 'e', '\u1ebd': 'e', '\u00ea': 'e', '\u1ec1': 'e', '\u1ebf': 'e', '\u1ec7': 'e', '\u1ec3': 'e', '\u1ec5': 'e',\n        '\u00ec': 'i', '\u00ed': 'i', '\u1ecb': 'i', '\u1ec9': 'i', '\u0129': 'i',\n        '\u00f2': 'o', '\u00f3': 'o', '\u1ecd': 'o', '\u1ecf': 'o', '\u00f5': 'o', '\u00f4': 'o', '\u1ed3': 'o', '\u1ed1': 'o', '\u1ed9': 'o', '\u1ed5': 'o', '\u1ed7': 'o', '\u01a1': 'o', '\u1edd': 'o', '\u1edb': 'o', '\u1ee3': 'o', '\u1edf': 'o', '\u1ee1': 'o',\n        '\u00f9': 'u', '\u00fa': 'u', '\u1ee5': 'u', '\u1ee7': 'u', '\u0169': 'u', '\u01b0': 'u', '\u1eeb': 'u', '\u1ee9': 'u', '\u1ef1': 'u', '\u1eed': 'u', '\u1eef': 'u',\n        '\u1ef3': 'y', '\u00fd': 'y', '\u1ef5': 'y', '\u1ef7': 'y', '\u1ef9': 'y',\n        '\u0111': 'd',\n        '\u00c0': 'A', '\u00c1': 'A', '\u1ea0': 'A', '\u1ea2': 'A', '\u00c3': 'A', '\u00c2': 'A', '\u1ea6': 'A', '\u1ea4': 'A', '\u1eac': 'A', '\u1ea8': 'A', '\u1eaa': 'A', '\u0102': 'A', '\u1eb0': 'A', '\u1eae': 'A', '\u1eb6': 'A', '\u1eb2': 'A', '\u1eb4': 'A',\n        '\u00c8': 'E', '\u00c9': 'E', '\u1eb8': 'E', '\u1eba': 'E', '\u1ebc': 'E', '\u00ca': 'E', '\u1ec0': 'E', '\u1ebe': 'E', '\u1ec6': 'E', '\u1ec2': 'E', '\u1ec4': 'E',\n        '\u00cc': 'I', '\u00cd': 'I', '\u1eca': 'I', '\u1ec8': 'I', '\u0128': 'I',\n        '\u00d2': 'O', '\u00d3': 'O', '\u1ecc': 'O', '\u1ece': 'O', '\u00d5': 'O', '\u00d4': 'O', '\u1ed2': 'O', '\u1ed0': 'O', '\u1ed8': 'O', '\u1ed4': 'O', '\u1ed6': 'O', '\u01a0': 'O', '\u1edc': 'O', '\u1eda': 'O', '\u1ee2': 'O', '\u1ede': 'O', '\u1ee0': 'O',\n        '\u00d9': 'U', '\u00da': 'U', '\u1ee4': 'U', '\u1ee6': 'U', '\u0168': 'U', '\u01af': 'U', '\u1eea': 'U', '\u1ee8': 'U', '\u1ef0': 'U', '\u1eec': 'U', '\u1eee': 'U',\n        '\u1ef2': 'Y', '\u00dd': 'Y', '\u1ef4': 'Y', '\u1ef6': 'Y', '\u1ef8': 'Y',\n        '\u0110': 'D'\n    };\n\n    \/\/ Khai b\u00e1o t\u1ea5t c\u1ea3 functions cho window object\n    window.convertCase = function(caseType) {\n        const text = textInput.value;\n        if (!text.trim()) {\n            showNotification('Vui l\u00f2ng nh\u1eadp v\u0103n b\u1ea3n tr\u01b0\u1edbc!', 'error');\n            return;\n        }\n\n        saveState();\n        let convertedText = '';\n\n        switch(caseType) {\n            case 'sentence':\n                \/\/ Vi\u1ebft hoa \u0111\u1ea7u m\u1ed7i d\u00f2ng v\u00e0 sau d\u1ea5u c\u00e2u\n                convertedText = text.toLowerCase();\n                \/\/ Vi\u1ebft hoa \u0111\u1ea7u d\u00f2ng\n                convertedText = convertedText.replace(\/(^|\\n)([a-zA-Z\u00e0\u00e1\u1ea1\u1ea3\u00e3\u00e2\u1ea7\u1ea5\u1ead\u1ea9\u1eab\u0103\u1eb1\u1eaf\u1eb7\u1eb3\u1eb5\u00e8\u00e9\u1eb9\u1ebb\u1ebd\u00ea\u1ec1\u1ebf\u1ec7\u1ec3\u1ec5\u00ec\u00ed\u1ecb\u1ec9\u0129\u00f2\u00f3\u1ecd\u1ecf\u00f5\u00f4\u1ed3\u1ed1\u1ed9\u1ed5\u1ed7\u01a1\u1edd\u1edb\u1ee3\u1edf\u1ee1\u00f9\u00fa\u1ee5\u1ee7\u0169\u01b0\u1eeb\u1ee9\u1ef1\u1eed\u1eef\u1ef3\u00fd\u1ef5\u1ef7\u1ef9\u0111])\/g, function(match, prefix, letter) {\n                    return prefix + letter.toUpperCase();\n                });\n                \/\/ Vi\u1ebft hoa sau d\u1ea5u c\u00e2u\n                convertedText = convertedText.replace(\/([.!?]\\s*)([a-zA-Z\u00e0\u00e1\u1ea1\u1ea3\u00e3\u00e2\u1ea7\u1ea5\u1ead\u1ea9\u1eab\u0103\u1eb1\u1eaf\u1eb7\u1eb3\u1eb5\u00e8\u00e9\u1eb9\u1ebb\u1ebd\u00ea\u1ec1\u1ebf\u1ec7\u1ec3\u1ec5\u00ec\u00ed\u1ecb\u1ec9\u0129\u00f2\u00f3\u1ecd\u1ecf\u00f5\u00f4\u1ed3\u1ed1\u1ed9\u1ed5\u1ed7\u01a1\u1edd\u1edb\u1ee3\u1edf\u1ee1\u00f9\u00fa\u1ee5\u1ee7\u0169\u01b0\u1eeb\u1ee9\u1ef1\u1eed\u1eef\u1ef3\u00fd\u1ef5\u1ef7\u1ef9\u0111])\/g, function(match, punctuation, letter) {\n                    return punctuation + letter.toUpperCase();\n                });\n                break;\n            case 'lower':\n                convertedText = text.toLowerCase();\n                break;\n            case 'upper':\n                convertedText = text.toUpperCase();\n                break;\n            case 'title':\n                \/\/ Regex bao g\u1ed3m t\u1ea5t c\u1ea3 k\u00fd t\u1ef1 ti\u1ebfng Vi\u1ec7t\n                convertedText = text.replace(\/[a-zA-Z\u00e0\u00e1\u1ea1\u1ea3\u00e3\u00e2\u1ea7\u1ea5\u1ead\u1ea9\u1eab\u0103\u1eb1\u1eaf\u1eb7\u1eb3\u1eb5\u00e8\u00e9\u1eb9\u1ebb\u1ebd\u00ea\u1ec1\u1ebf\u1ec7\u1ec3\u1ec5\u00ec\u00ed\u1ecb\u1ec9\u0129\u00f2\u00f3\u1ecd\u1ecf\u00f5\u00f4\u1ed3\u1ed1\u1ed9\u1ed5\u1ed7\u01a1\u1edd\u1edb\u1ee3\u1edf\u1ee1\u00f9\u00fa\u1ee5\u1ee7\u0169\u01b0\u1eeb\u1ee9\u1ef1\u1eed\u1eef\u1ef3\u00fd\u1ef5\u1ef7\u1ef9\u0111\u0110][^\\s]*\/g, (word) => {\n                    return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();\n                });\n                break;\n        }\n\n        textInput.value = convertedText;\n        updateStats();\n        showNotification('\u0110\u00e3 chuy\u1ec3n \u0111\u1ed5i th\u00e0nh c\u00f4ng!');\n    };\n\n    window.removeAccents = function() {\n        const text = textInput.value;\n        if (!text.trim()) {\n            showNotification('Vui l\u00f2ng nh\u1eadp v\u0103n b\u1ea3n tr\u01b0\u1edbc!', 'error');\n            return;\n        }\n        \n        saveState();\n        let result = text;\n        for (let char in vietnameseMap) {\n            result = result.replace(new RegExp(char, 'g'), vietnameseMap[char]);\n        }\n        \n        textInput.value = result;\n        updateStats();\n        showNotification('\u0110\u00e3 b\u1ecf d\u1ea5u ti\u1ebfng Vi\u1ec7t!');\n    };\n\n    window.removeSpaces = function() {\n        saveState();\n        const text = textInput.value;\n        textInput.value = text.replace(\/\\s+\/g, '');\n        updateStats();\n        showNotification('\u0110\u00e3 b\u1ecf t\u1ea5t c\u1ea3 kho\u1ea3ng c\u00e1ch!');\n    };\n\n    window.spaceToUnderscore = function() {\n        saveState();\n        const text = textInput.value;\n        textInput.value = text.replace(\/\\s+\/g, '_');\n        updateStats();\n        showNotification('\u0110\u00e3 thay th\u1ebf kho\u1ea3ng c\u00e1ch b\u1eb1ng d\u1ea5u g\u1ea1ch d\u01b0\u1edbi!');\n    };\n\n    window.searchAndReplace = function() {\n        const searchText = document.getElementById('searchText').value;\n        const replaceText = document.getElementById('replaceText').value;\n        const text = textInput.value;\n        \n        if (!searchText) {\n            showNotification('Vui l\u00f2ng nh\u1eadp t\u1eeb c\u1ea7n t\u00ecm!', 'error');\n            return;\n        }\n        \n        saveState();\n        const regex = new RegExp(searchText.replace(\/[.*+?^${}()|[\\]\\\\]\/g, '\\\\$&'), 'g');\n        const newText = text.replace(regex, replaceText);\n        const count = (text.match(regex) || []).length;\n        \n        textInput.value = newText;\n        updateStats();\n        showNotification(`\u0110\u00e3 thay th\u1ebf ${count} l\u1ea7n!`);\n    };\n\n    window.newlineToComma = function() {\n        saveState();\n        const text = textInput.value;\n        textInput.value = text.replace(\/\\n\/g, ', ');\n        updateStats();\n        showNotification('\u0110\u00e3 chuy\u1ec3n d\u00f2ng m\u1edbi th\u00e0nh d\u1ea5u ph\u1ea9y!');\n    };\n\n    window.commaToNewline = function() {\n        saveState();\n        const text = textInput.value;\n        textInput.value = text.replace(\/,\\s*\/g, '\\n');\n        updateStats();\n        showNotification('\u0110\u00e3 chuy\u1ec3n d\u1ea5u ph\u1ea9y th\u00e0nh d\u00f2ng m\u1edbi!');\n    };\n\n    window.removeEmptyLines = function() {\n        saveState();\n        const text = textInput.value;\n        textInput.value = text.replace(\/^\\s*\\n\/gm, '');\n        updateStats();\n        showNotification('\u0110\u00e3 x\u00f3a t\u1ea5t c\u1ea3 d\u00f2ng tr\u1eafng!');\n    };\n\n    window.textToBinary = function() {\n        const text = textInput.value;\n        if (!text.trim()) {\n            showNotification('Vui l\u00f2ng nh\u1eadp v\u0103n b\u1ea3n tr\u01b0\u1edbc!', 'error');\n            return;\n        }\n        \n        saveState();\n        const binary = text.split('').map(char => \n            char.charCodeAt(0).toString(2).padStart(8, '0')\n        ).join(' ');\n        \n        textInput.value = binary;\n        updateStats();\n        showNotification('\u0110\u00e3 chuy\u1ec3n sang m\u00e3 Binary!');\n    };\n\n    window.textToHex = function() {\n        const text = textInput.value;\n        if (!text.trim()) {\n            showNotification('Vui l\u00f2ng nh\u1eadp v\u0103n b\u1ea3n tr\u01b0\u1edbc!', 'error');\n            return;\n        }\n        \n        saveState();\n        const hex = text.split('').map(char => \n            char.charCodeAt(0).toString(16).padStart(2, '0')\n        ).join(' ');\n        \n        textInput.value = hex.toUpperCase();\n        updateStats();\n        showNotification('\u0110\u00e3 chuy\u1ec3n sang m\u00e3 Hex!');\n    };\n\n    window.binaryToText = function() {\n        const text = textInput.value;\n        if (!text.trim()) {\n            showNotification('Vui l\u00f2ng nh\u1eadp m\u00e3 Binary tr\u01b0\u1edbc!', 'error');\n            return;\n        }\n        \n        try {\n            saveState();\n            const result = text.split(' ').map(binary => \n                String.fromCharCode(parseInt(binary, 2))\n            ).join('');\n            \n            textInput.value = result;\n            updateStats();\n            showNotification('\u0110\u00e3 chuy\u1ec3n t\u1eeb Binary sang v\u0103n b\u1ea3n!');\n        } catch (e) {\n            showNotification('M\u00e3 Binary kh\u00f4ng h\u1ee3p l\u1ec7!', 'error');\n        }\n    };\n\n    window.hexToText = function() {\n        const text = textInput.value;\n        if (!text.trim()) {\n            showNotification('Vui l\u00f2ng nh\u1eadp m\u00e3 Hex tr\u01b0\u1edbc!', 'error');\n            return;\n        }\n        \n        try {\n            saveState();\n            const result = text.split(' ').map(hex => \n                String.fromCharCode(parseInt(hex, 16))\n            ).join('');\n            \n            textInput.value = result;\n            updateStats();\n            showNotification('\u0110\u00e3 chuy\u1ec3n t\u1eeb Hex sang v\u0103n b\u1ea3n!');\n        } catch (e) {\n            showNotification('M\u00e3 Hex kh\u00f4ng h\u1ee3p l\u1ec7!', 'error');\n        }\n    };\n\n    window.undoAction = function() {\n        if (currentStep > 0) {\n            currentStep--;\n            textInput.value = history[currentStep];\n            updateStats();\n            showNotification('\u0110\u00e3 ho\u00e0n t\u00e1c th\u00e0nh c\u00f4ng!');\n        } else {\n            showNotification('Kh\u00f4ng c\u00f3 thao t\u00e1c n\u00e0o \u0111\u1ec3 ho\u00e0n t\u00e1c!', 'error');\n        }\n    };\n\n    window.copyToClipboard = function() {\n        const text = textInput.value;\n        if (!text.trim()) {\n            showNotification('Kh\u00f4ng c\u00f3 v\u0103n b\u1ea3n \u0111\u1ec3 sao ch\u00e9p!', 'error');\n            return;\n        }\n\n        navigator.clipboard.writeText(text).then(() => {\n            showNotification('\u0110\u00e3 sao ch\u00e9p v\u00e0o clipboard!');\n        }).catch(() => {\n            textInput.select();\n            document.execCommand('copy');\n            showNotification('\u0110\u00e3 sao ch\u00e9p v\u00e0o clipboard!');\n        });\n    };\n\n    window.downloadText = function() {\n        const text = textInput.value;\n        if (!text.trim()) {\n            showNotification('Kh\u00f4ng c\u00f3 v\u0103n b\u1ea3n \u0111\u1ec3 t\u1ea3i xu\u1ed1ng!', 'error');\n            return;\n        }\n\n        const blob = new Blob([text], { type: 'text\/plain;charset=utf-8' });\n        const url = window.URL.createObjectURL(blob);\n        const a = document.createElement('a');\n        a.href = url;\n        a.download = 'van-ban-da-chuyen-doi.txt';\n        document.body.appendChild(a);\n        a.click();\n        document.body.removeChild(a);\n        window.URL.revokeObjectURL(url);\n        showNotification('\u0110\u00e3 t\u1ea3i xu\u1ed1ng th\u00e0nh c\u00f4ng!');\n    };\n\n    window.clearText = function() {\n        saveState();\n        textInput.value = '';\n        updateStats();\n        showNotification('\u0110\u00e3 x\u00f3a to\u00e0n b\u1ed9 v\u0103n b\u1ea3n!');\n    };\n\n    function showNotification(message, type = 'success') {\n        const notification = document.getElementById('notification');\n        notification.textContent = message;\n        notification.className = `notification show ${type}`;\n        \n        setTimeout(() => {\n            notification.classList.remove('show');\n        }, 3000);\n    }\n\n    \/\/ Auto-resize textarea\n    textInput.addEventListener('input', function() {\n        this.style.height = 'auto';\n        this.style.height = Math.max(this.scrollHeight, 160) + 'px';\n    });\n\n    \/\/ Kh\u1edfi t\u1ea1o\n    updateStats();\n})();\n<\/script>\n<\/div><h3 class=\"wp-block-heading\"><\/h3><h1 class=\"wp-block-heading\">Free Text Conversion Tool \u2013 Professional Vietnamese Text Processing<\/h1><p>You are looking for a <strong>Vietnamese text conversion tool<\/strong> powerful, free and easy to use? <a class=\"wpil_keyword_link\" href=\"https:\/\/dps.media\/en\/\" title=\"DPS.MEDIA JSC\" data-wpil-keyword-link=\"linked\" data-wpil-monitor-id=\"34\">DPS.MEDIA<\/a> self introduction <strong>Text Converter Tool<\/strong> \u2013 the perfect solution for all your text processing needs.<\/p><h2 class=\"wp-block-heading\">Why choose DPS.MEDIA's Text Conversion Tool?<\/h2><h3 class=\"wp-block-heading\">\ud83d\ude80 Outstanding features<\/h3><p><strong>Text Converter Tool<\/strong> DPS.MEDIA is not just a simple case conversion tool. We have developed a comprehensive toolset with <strong>14+ advanced features<\/strong>:<\/p><h4 class=\"wp-block-heading\">Text formatting conversion:<\/h4><ul class=\"wp-block-list\">\n<li><strong>Capitalize first letter<\/strong>: Automatically capitalize the first letter of each line and after punctuation<\/li>\n\n\n\n<li><strong>lowercase \/ UPPERCASE<\/strong>: Convert the entire text<\/li>\n\n\n\n<li><strong>Title Case<\/strong>: Capitalize the first letter of each word for professional titles<\/li>\n<\/ul><h4 class=\"wp-block-heading\">Advanced Vietnamese text processing:<\/h4><ul class=\"wp-block-list\">\n<li><strong>Remove Vietnamese accents<\/strong>: Convert \u201cXin ch\u00e0o\u201d to \u201cXin chao\u201d<\/li>\n\n\n\n<li><strong>Search and replace<\/strong>: Regex-powered search &amp; replace<\/li>\n\n\n\n<li><strong>Count words, characters, lines<\/strong>: Real-time text statistics<\/li>\n<\/ul><h4 class=\"wp-block-heading\">Advanced formatting tools:<\/h4><ul class=\"wp-block-list\">\n<li><strong>Remove spaces<\/strong>: Remove all unnecessary spaces<\/li>\n\n\n\n<li><strong>Replace _ with space<\/strong>: Convert spaces to underscores<\/li>\n\n\n\n<li><strong>Newline \u2194 Comma<\/strong>: Convert list formats<\/li>\n\n\n\n<li><strong>Delete blank lines<\/strong>: Clean text<\/li>\n<\/ul><h4 class=\"wp-block-heading\">Encoding &amp; decoding:<\/h4><ul class=\"wp-block-list\">\n<li><strong>Text \u2194 Binary<\/strong>: Convert binary code<\/li>\n\n\n\n<li><strong>Text \u2194 Hexadecimal<\/strong>: Encode hexadecimal<\/li>\n\n\n\n<li><strong>Undo<\/strong>: Go back 20 steps<\/li>\n<\/ul><h3 class=\"wp-block-heading\">\ud83d\udca1 At a glance<\/h3><p><strong>1. Friendly interface<\/strong><\/p><ul class=\"wp-block-list\">\n<li>Modern, responsive design 100%<\/li>\n\n\n\n<li>Professional typography with Inter font<\/li>\n\n\n\n<li>Smooth user experience<\/li>\n<\/ul><p><strong>2. Fast processing speed<\/strong><\/p><ul class=\"wp-block-list\">\n<li>Client-side processing, no internet needed<\/li>\n\n\n\n<li>No text length limit<\/li>\n\n\n\n<li>Instant results<\/li>\n<\/ul><p><strong>3. Absolute security<\/strong><\/p><ul class=\"wp-block-list\">\n<li>No user data storage<\/li>\n\n\n\n<li>Completely offline processing<\/li>\n\n\n\n<li>100% privacy<\/li>\n<\/ul><h2 class=\"wp-block-heading\">Instructions for using the Text Conversion Tool<\/h2><h3 class=\"wp-block-heading\">Step 1: Enter text<\/h3><p>Paste or type the text to be processed into the textarea. The tool will automatically count characters, words, and lines.<\/p><h3 class=\"wp-block-heading\">Step 2: Select function<\/h3><p>Click the button corresponding to the function you want:<\/p><ul class=\"wp-block-list\">\n<li><strong>Change case<\/strong>: Sentence, lower, UPPER, Title<\/li>\n\n\n\n<li><strong>Vietnamese processing<\/strong>: Remove accents, search and replace<\/li>\n\n\n\n<li><strong>Format<\/strong>: Handle space, newline, comma<\/li>\n\n\n\n<li><strong>Encoding<\/strong>: Binary, Hex conversion<\/li>\n<\/ul><h3 class=\"wp-block-heading\">Step 3: Export results<\/h3><ul class=\"wp-block-list\">\n<li><strong>Copy<\/strong>: Copy results to clipboard<\/li>\n\n\n\n<li><strong>Download<\/strong>: Download .txt file<\/li>\n\n\n\n<li><strong>Undo<\/strong>: Go back to previous step if needed<\/li>\n<\/ul><h2 class=\"wp-block-heading\">Practical applications of Text Converter Tool<\/h2><h3 class=\"wp-block-heading\">For Content Writers &amp; Bloggers<\/h3><ul class=\"wp-block-list\">\n<li>Standardize article formatting<\/li>\n\n\n\n<li>Create SEO-friendly titles<\/li>\n\n\n\n<li>Process data from multiple sources<\/li>\n<\/ul><h3 class=\"wp-block-heading\">For Developers &amp; Coders<\/h3><ul class=\"wp-block-list\">\n<li>Convert data formats<\/li>\n\n\n\n<li>Encode\/decode text<\/li>\n\n\n\n<li>Clean code comments<\/li>\n<\/ul><h3 class=\"wp-block-heading\">For Marketing &amp; SEO<\/h3><ul class=\"wp-block-list\">\n<li>Prepare content for multiple platforms<\/li>\n\n\n\n<li>Optimize meta descriptions<\/li>\n\n\n\n<li>Process keyword lists<\/li>\n<\/ul><h3 class=\"wp-block-heading\">For Translation &amp; Editing<\/h3><ul class=\"wp-block-list\">\n<li>Standardize translations<\/li>\n\n\n\n<li>Remove punctuation for indexing<\/li>\n\n\n\n<li>Professional text formatting<\/li>\n<\/ul><h2 class=\"wp-block-heading\">Compare with other tools<\/h2><pre class=\"wp-block-preformatted\">FeaturesDPS.MEDIA ToolOther toolsVietnamese support\u2705 Full\u274c LimitedFeature count\u2705 14+\u274c 3-5Undo function\u2705 20 steps\u274c NoneBeautiful typography\u2705 Professional\u274c BasicResponsive design\u2705 100%\u274c PoorProcessing speed\u2705 Instant\u274c Slow<\/pre><h2 class=\"wp-block-heading\">Why did DPS.MEDIA develop this tool?<\/h2><p>At <strong>DPS.MEDIA<\/strong>, we understand that text processing is a daily necessity for many people. From content creators and developers to office workers \u2013 everyone needs utility tools to work more effectively.<\/p><p>We are not satisfied with the current online tools because:<\/p><ul class=\"wp-block-list\">\n<li>Lack of Vietnamese support<\/li>\n\n\n\n<li>Outdated interface<\/li>\n\n\n\n<li>Limited features<\/li>\n\n\n\n<li>Not optimized for mobile<\/li>\n<\/ul><p>Therefore, <strong>Text Converter Tool<\/strong> It was created with the mission to bring the best experience to Vietnamese users.<\/p><h2 class=\"wp-block-heading\">How to integrate into your website<\/h2><p>Are you a developer or website owner wanting to integrate this tool? It's very simple:<\/p><ol class=\"wp-block-list\">\n<li><strong>Copy HTML code<\/strong> complete<\/li>\n\n\n\n<li><strong>Paste into WordPress<\/strong> Custom HTML block<\/li>\n\n\n\n<li><strong>No config needed<\/strong> anything else \u2013 plug &amp; play!<\/li>\n<\/ol><p>The tool is designed to be responsive and will automatically fit your website design.<\/p><h2 class=\"wp-block-heading\">FAQ \u2013 Frequently Asked Questions<\/h2><p><strong>Q: Is the tool free?<\/strong> A: Completely free, no usage limits.<\/p><p><strong>Q: Do I need to register an account?<\/strong> A: No need, use immediately.<\/p><p><strong>Q: Is data stored?<\/strong> A: No, all processing happens locally on your device.<\/p><p><strong>Q: Is mobile support available?<\/strong> A: Yes, 100% responsive on all devices.<\/p><p><strong>Q: Is there a limit on text length?<\/strong> A: No limit, only depends on your device's RAM.<\/p><h2 class=\"wp-block-heading\">Conclusion<\/h2><p><strong>DPS.MEDIA's Text Conversion Tool<\/strong> is a comprehensive, modern, and completely free solution for all Vietnamese text processing needs. With over 14 powerful features, a professional interface, and an excellent user experience, this is definitely a tool you need to bookmark today.<\/p><p><strong>Try it now<\/strong> and experience the difference! The tool is continuously updated with many new features from the DPS.MEDIA team.<\/p>","protected":false},"excerpt":{"rendered":"<p>{\"translations\":[{\"Text Conversion Tool Convert and process Vietnamese text professionally 0 characters 0 words 0 lines Find &amp; Replace Sentence case lowercase UPPERCASE Title Remove Vietnamese accents Remove spaces Replace _ for space New line \u2192 Comma [\u2026]\"}]}<\/p>","protected":false},"author":1,"featured_media":28000,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"footnotes":""},"class_list":["post-27990","page","type-page","status-publish","has-post-thumbnail","hentry"],"acf":[],"rankmath_keywords":{"primary":"","secondary":[""]},"yoast_keywords":{"primary":"","secondary":[]},"yoast_focuskw":"","rankmath_focuskw":"","seo_keywords":{"primary":"","secondary":[""]},"_links":{"self":[{"href":"https:\/\/dps.media\/en\/wp-json\/wp\/v2\/pages\/27990","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dps.media\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/dps.media\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/dps.media\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/dps.media\/en\/wp-json\/wp\/v2\/comments?post=27990"}],"version-history":[{"count":7,"href":"https:\/\/dps.media\/en\/wp-json\/wp\/v2\/pages\/27990\/revisions"}],"predecessor-version":[{"id":28630,"href":"https:\/\/dps.media\/en\/wp-json\/wp\/v2\/pages\/27990\/revisions\/28630"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/dps.media\/en\/wp-json\/wp\/v2\/media\/28000"}],"wp:attachment":[{"href":"https:\/\/dps.media\/en\/wp-json\/wp\/v2\/media?parent=27990"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}